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获取出现问题,别的还好。