hdu1728 逃离迷宫bfs

题目链接:http://icpc.njust.edu.cn/Problem/Hdu/1728/

关于广度优先搜索的第一篇题解。广度优先搜索,就是状态树的层次遍历,一层一层的搜索,直到搜索到目标状态为止。在扩展的过程中设定一种由上一层扩展到下一层的转化机制,将出现的新的状态放入队列之中,每次取出队首元素,大部分情况下bfs是用来搜索最优值的问题,优先队列的作用就是一旦搜索到目标状态,跟随的结果状态一定是最优的。为了避免重复相同的搜索,可设置访问记录。一般运用队列这种数据结构,使得最初搜索的状态在前,可以继续下一次搜索。

题目意思:给出地图,要求判断在最多k次转弯的条件下是否能够从一点都到另一点。写完记得检查变量的初始化。

代码如下:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef unsigned int ui;
 4 typedef long long ll;
 5 typedef unsigned long long ull;
 6 #define pf printf
 7 #define mem(a,b) memset(a,b,sizeof(a))
 8 #define prime1 1e9+7
 9 #define prime2 1e9+9
10 #define pi 3.14159265
11 #define lson l,mid,rt<<1
12 #define rson mid+1,r,rt<<1|1
13 #define scand(x) scanf("%llf",&x) 
14 #define f(i,a,b) for(int i=a;i<=b;i++)
15 #define scan(a) scanf("%d",&a)
16 #define dbg(args) cout<<#args<<":"<<args<<endl;
17 #define inf 0x3f3f3f3f
18 #define maxn 105
19 #define maxm 2000010
20 int n,m,t,k;
21 int Map[maxn][maxn];
22 int sx,sy,tx,ty;
23 bool flag=false,vis[maxn][maxn];
24 int dir[][2]={0,1,0,-1,1,0,-1,0};
25 struct node{
26     int x,y;
27     int step;
28     node(int x,int y,int step):x(x),y(y),step(step){};
29     node(){};
30 }; 
31 node cur,nxt;
32 void bfs()
33 {
34     queue<node>q;
35     node st(sx,sy,-1);
36     q.push(st);
37     vis[sx][sy]=true;//标记该状态已经访问过 
38     while(!q.empty())
39     {
40         cur=q.front();//获取队首结点
41         q.pop();//队首状态弹出 
42         if(cur.x==tx&&cur.y==ty&&cur.step<=k)
43         {
44         //    dbg(cur.step);
45             flag=true;
46             return;
47         }
48         f(i,0,3)
49         {
50             nxt=cur;
51             nxt.x+=dir[i][0];
52             nxt.y+=dir[i][1];
53             while(nxt.x>=0&&nxt.x<n&&nxt.y>=0&&nxt.y<m&&Map[nxt.x][nxt.y])//检查是否越界、可走 
54             {
55                 if(!vis[nxt.x][nxt.y])//只要没有访问过,那一定是经过转弯了的,我们设定一次朝着一个方向一直走到底 
56                 {
57                     vis[nxt.x][nxt.y]=true;
58                     nxt.step=cur.step+1;
59                     q.push(nxt);//合法状态入队 
60                 }
61                 nxt.x+=dir[i][0];
62                 nxt.y+=dir[i][1];//继续朝同一个方向走到底,这个方向上的step都是同一个值 
63             }
64         }
65     }
66 }
67 int main()
68 {
69     //freopen("input.txt","r",stdin);
70     //freopen("output.txt","w",stdout);
71     std::ios::sync_with_stdio(false);
72     scan(t);
73     while(t--)
74     {
75         flag=false;
76         scan(n);
77         scan(m);
78         mem(Map,0);
79         mem(vis,false);
80         char c;
81         f(i,0,n-1)
82             f(j,0,m-1)
83             {
84                 scanf(" %c",&c);
85                 if(c=='.')Map[i][j]=1;
86             }
87             scanf("%d%d%d%d%d",&k,&sy,&sx,&ty,&tx);//注意数据的读入,行列不可错 
88             sx--,sy--,tx--,ty--;
89             bfs();
90             if(flag)pf("yes
");
91             else pf("no
");
92      } 
93  } 
原文地址:https://www.cnblogs.com/randy-lo/p/12506915.html