如果N个点,求到达终点的最短步数:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include <iostream> 2 #include <stdio.h> 3 #include <math.h> 4 #include<stdio.h> 5 #include<string.h> 6 #include <stdlib.h> 7 #include <utility> 8 #include <map> 9 #include <queue> 10 #define MAX(x,y) ((x)>(y)?(x):(y)) 11 #define MIN(x,y) ((x)<(y)?(x):(y)) 12 #define SET(ID) memset(ID,0,sizeof(ID)) 13 using namespace std; 14 typedef struct Point 15 { 16 int X; 17 int Y; 18 int sign; /*标记当前这个数是否被用过*/ 19 }xy; 20 xy X_Y[10086]; /*点的个数*/ 21 int N; /*N为石头的数量*/ 22 int SIGN; /*SIGN记录是否能够到终点*/ 23 int BFS() /*返回最短路径的步数,如果找不到返回-1,0~N-1*/ 24 { 25 queue<int> q;/*队列中保存的指是对应点的下标*/ 26 int Times=0; /*Times记录当前这个点在队列中的位置*/ 27 int times=1; /*times记录队尾的位置*/ 28 int Step[10086]; /*记录当前为第几层搜索*/ 29 SET(Step); /*初始化*/ 30 q.push(0); /*先把X轴进队列*/ 31 X_Y[0].sign=1; /*标记使用过*/ 32 Step[Times]=0; /*记录当前搜索层数为0*/ 33 if(第一步就找到终点) return 1; /*如果第一步就能够找到终点*/ 34 while(!q.empty()) /*队列不为空,则继续操作*/ 35 { 36 int Now=q.front(); /*获取队头元素,作为当前的点*/ 37 q.pop(); /*出队头元素*/ 38 for(int j=1;j<N;j++) /*点的个数从一开始记数*/ 39 { 40 if(X_Y[j].sign==1)continue; /*判断这个点是否进队列,已经进队列则不在判断*/ 41 if(符合条件进队列) /*两点距离是否小于能够走的最大距离*/ 42 { 43 q.push(j); 44 Step[times++]=Step[Times]+1; /*符合条件的点的层数=当前搜索层数+1*/ 45 if(是否找到终点)return Step[times-1];} 46 X_Y[j].sign=1; /*标记这个点是否已经进队列*/ 47 } 48 } 49 Times++; 50 } 51 if(!SIGN) 52 return SIGN; 53 } 54 int main() 55 { 56 int T,X,Y,Run_Len; 57 int Min_Step; 58 xy Now_XY; 59 scanf("%d",&T); 60 while(T--) 61 { 62 scanf("%d%",&N); 63 { 64 for(int i=0;i<N;i++) 65 { 66 scanf("%d%d",&X_Y[i].X,&X_Y[i].Y); 67 X_Y[i].sign=0; /*初始化标记为0*/ 68 } 69 Min_Step=BFS(); 70 if(SIGN)//能找到输出最短路径 71 printf("YES\n%d\n",Min_Step); 72 73 } 74 } 75 return 0; 76 }