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.基础题。