PAT Saving James Bond - Hard Version

Saving James Bond - Hard Version

与原来那个简单版本不同的是  要记录下逃出的最短路径并输出   其中有一点要特别注意 If there are many shortest paths, just output the one with the minimum first jump, which is guaranteed to be unique.  

也就是当步数相同的时候 输出跳出第一步最短的那条路

这道题花了我很多时间   本来是想偷个懒 在简单版的基础上改改妄想快点通过   结果代码越改越长 写的有点乱 终于还是AC了 

因为我用了DFS  写了很久我才反应过来可以用BFS  

这边还是给出AC代码  比较渣  若节点四不过  可以尝试下这个数据

6 20
-27 0
-41 0
0 26
0 40
0 25
0 41

答案应该是

3

0 25

0 40

 

还有一种情况节点五 就是007是超人 一步跨出的情况  这个比较简单  大家可以看我代码

 

  1 #include <stdio.h>

  2 #include <math.h>

  3 #include <stdlib.h>

  4 

  5 int flag[150],flag1=0,flag2=0;

  6 int N;

  7 int count,pos;

  8 float sum1,sum;

  9 

 10 float r,dis,D;

 11 

 12 typedef struct 

 13 {

 14     int x;

 15     int y;

 16 }crocodile;

 17 crocodile c[150];

 18 crocodile a[150];

 19 crocodile b[150];

 20 void DFS(int i)

 21 {

 22     int k;

 23     r=D;

 24     flag[i]=1;

 25     if((50-abs(c[i].x))<=r ||(50-abs(c[i].y))<=r)

 26     {

 27         if(!flag1)

 28         {

 29             pos=count;

 30             for(k=0;k<pos;k++)

 31             {

 32                 b[k].x=a[k].x;

 33                 b[k].y=a[k].y;

 34             }        

 35         }    

 36         if(count==pos)

 37         {

 38             sum=sqrt(b[0].x*b[0].x+b[0].y*b[0].y);

 39             sum1=sqrt(a[0].x*a[0].x+a[0].y*a[0].y);

 40             if(sum1<sum)

 41             {

 42                 for(k=0;k<pos;k++)

 43                 {

 44                     b[k].x=a[k].x;

 45                     b[k].y=a[k].y;            

 46                 }

 47             }

 48         }

 49         if(count<pos)

 50         {    

 51             pos=count;

 52             for(k=0;k<pos;k++)

 53             {

 54                 b[k].x=a[k].x;

 55                 b[k].y=a[k].y;

 56             

 57             }

 58         }

 59         flag1=1;

 60         return;

 61     }    

 62     int j;

 63     

 64     for(j=1;j<=N;j++)

 65     {

 66         

 67         dis=sqrt((c[j].x-c[i].x)*(c[j].x-c[i].x)+(c[j].y-c[i].y)*(c[j].y-c[i].y));

 68         if(dis<=r && flag[j]!=1)

 69         {

 70             a[count].x=c[j].x;

 71             a[count].y=c[j].y;

 72             count++;

 73             DFS(j);    

 74             flag[j]=0;        

 75             count--;

 76         }

 77     }

 78 }

 79 main()

 80 {

 81     int i,j;    

 82     int k;

 83     scanf("%d%f",&N,&D);

 84     

 85     c[0].x=c[0].y=0;

 86     for(i=1;i<=N;i++)

 87     {

 88         if(D>=42.5)

 89         {

 90             flag1=2;

 91             break;

 92         }    

 93         scanf("%d%d",&c[i].x,&c[i].y);

 94     }

 95         

 96     r=15.0/2+D;

 97     i=0;

 98     for(j=1;j<=N;j++)

 99     {

100         if(    flag1==2)

101             break;

102         dis=sqrt((c[j].x-c[i].x)*(c[j].x-c[i].x)+(c[j].y-c[i].y)*(c[j].y-c[i].y));

103         if(dis<=r && flag[j]!=1)

104         {

105             a[count].x=c[j].x;

106             a[count].y=c[j].y;

107             count++;

108             DFS(j);

109             count=0;

110             flag[j]=0;

111             r=15.0/2+D;

112         }    

113     }        

114     if(flag1==0)

115         printf("0\n");

116     else if(flag1==2)

117         printf("1\n");

118     else

119     {    

120         printf("%d\n",pos+1);

121         for(k=0;k<pos;k++)

122         {

123             printf("%d %d\n",b[k].x,b[k].y);

124         }

125         

126     }

127 }

 

你可能感兴趣的:(version)