07-图5-Saving James Bond - Hard Version-编程题
解题代码
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define MAXN 100
#define DIA 15
#define SIDE 100
typedef enum { false, true } bool;
typedef struct Data *PtrToData;
struct Data {
int x, y;
double distance;
int last;
int level;
}A[MAXN];
int N, D, LAST, TAIL, LEVEL=1;
int front = -1, rear = -1;
int B[MAXN], Q[MAXN];
void Enqueue(int last, int index);
int Dequeue(void);
bool CanJumpToSide(int index);
bool IsEmpty(void);
bool CanJump(int index1, int index2);
bool FirstJump(int index);
void Initialization(void);
int BFS(void);
void Print(int V);
void RePrint(int V);
int Cmp(const void *a, const void *b);
int main()
{
int i, flag = 0, V;
scanf("%d %d", &N, &D);
for (i = 0; i < N; i++)
scanf("%d %d", &A[i].x, &A[i].y);
if (CanJumpToSide(-1)) flag = 1;
else {
Initialization();
qsort(A, N, sizeof(struct Data), Cmp);
for (i = 0; i < N; i++)
if (!B[i] && FirstJump(i)) {
Enqueue(-1, i);
TAIL = i;
}
LAST = TAIL;
V = BFS();
}
if (flag) printf("1");
else {
if (V == -1) printf("0");
else Print(V);
}
return 0;
}
void Enqueue(int last,int index) {
Q[++rear] = index;
B[index] = 1;
A[index].last = last;
A[index].level = LEVEL;
}
int Dequeue(void) {
return Q[++front];
}
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;
int 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 IsEmpty(void) {
if (front == rear) 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 distacne = sqrt(pow(x1-x2,2) + pow(y1-y2,2));
if (distacne <= D) return true;
else return false;
}
bool FirstJump(int index) {
if (A[index].distance <= (double)DIA / 2 + D) return true;
else return false;
}
void Initialization(void) {
for (int i = 0; i < N; i++) {
A[i].last = -1;
A[i].level = 0;
A[i].distance = sqrt(pow(A[i].x,2) + pow(A[i].y,2));
}
}
int BFS(void) {
int V, i;
LEVEL++;
while(!IsEmpty()){
V = Dequeue();
if (CanJumpToSide(V)) return V;
for (i = 0; i < N; i++)
if (!B[i] && CanJump(V, i)) {
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);
}
int Cmp(const void *a, const void *b) {
return (int)(((PtrToData)a)->distance- ((PtrToData)b)->distance);
}
测试结果
问题整理
1.基础题。