7-11-Saving James Bond - Hard Version-编程题

7-11-Saving James Bond - Hard Version-编程题

解题代码

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define MAXN 100
#define SIDE 100
#define DIA 15
typedef enum { false, true } bool;
typedef struct Data *PtrToData;
struct Data {
	int x, y;
	int last;
	int level;
	double distance;
}A[MAXN];
int B[MAXN], Q[MAXN];
int N, D, rear = -1, front = -1, LEVEL = 1, LAST, TAIL;
void Fill_A(void);
int Cmp(const void *a, const void *b);
void Enqueue(int last, int index);
int Dequeue(void);
bool IsEmpty(void);
bool CanJumpToSide(int index);
bool CanJump(int index1, int index2);
bool FirstJump(int index);
int BFS(void);
void Print(int V);
void RePrint(int V);
int main()
{
	int flag = 0, V, i;
	scanf("%d %d", &N, &D);
	Fill_A();
	qsort(A, N, sizeof(struct Data), Cmp);
	if (CanJumpToSide(-1)) flag = 1;
	else {
		for (i = 0; i<N; i++)
			if (!B[i] && FirstJump(i)) {
				B[i] = 1;
				Enqueue(-1,i);
				TAIL = i;
			}
		LAST = TAIL;
		LEVEL++;
		V=BFS();
	}
	if (flag) printf("1");
	else {
		if (V == -1) printf("0");
		else Print(V);
	}
	return 0;
}
void Fill_A(void) {
	for (int i = 0; i < N; i++) {
		scanf("%d %d", &A[i].x, &A[i].y);
		A[i].last = -1;
		A[i].level = 0;
		A[i].distance = sqrt(pow(A[i].x, 2) + pow(A[i].y, 2));
	}
}
int Cmp(const void *a, const void *b) {
	return (int)(((PtrToData)a)->distance-((PtrToData)b)->distance);
}
void Enqueue(int last,int index) {
	Q[++rear] = index;
	A[index].last = last;
	A[index].level = LEVEL;
}
int Dequeue(void) {
	return Q[++front];
}
bool IsEmpty(void) {
	if (front == rear) return true;
	else return false;
}
bool CanJumpToSide(int index) {
	if (index == -1) {
		if ((double)DIA / 2 + D >= SIDE / 2) return true;
		else return false;
	}
	else {
		int x = A[index].x, y = A[index].y;
		if (x >= SIDE / 2 - D || x <= D - SIDE / 2 || y >= SIDE / 2 - D || y <= D - SIDE / 2) return true;
		else return false;
	}
}
bool CanJump(int index1, int index2) {
	int x1 = A[index1].x, y1 = A[index1].y;
	int x2 = A[index2].x, y2 = A[index2].y;
	double distance = sqrt(pow(x1-x2,2)+pow(y1-y2,2));
	if (distance <= D) return true;
	else return false;
}
bool FirstJump(int index) {
	if (A[index].distance <= (double)DIA / 2 + D) return true;
	else return false;
}
int BFS(void) {
	int i;
	while (!IsEmpty()) {
		int V = Dequeue();
		if (CanJumpToSide(V)) return V;
		for(i=0;i<N;i++)
			if (!B[i] && CanJump(V, i)) {
				B[i] = 1;
				Enqueue(V,i);
				TAIL = i;
			}
		if (V == LAST) {
			LEVEL++;
			LAST = TAIL;
		}
	}
	return -1;
}
void Print(int V) {
	printf("%d", A[V].level + 1);
	RePrint(V);
}
void RePrint(int V) {
	if (V == -1) return;
	RePrint(A[V].last);
	printf("\n%d %d", A[V].x, A[V].y);
}

测试结果

在这里插入图片描述

问题整理

1.LAST获取出现问题,别的还好。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值