【搜索】——最短路径(广搜)

如果N个点,求到达终点的最短步数:
 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 }
View Code

转载于:https://www.cnblogs.com/Wurq/articles/4424661.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值