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\n"); 91 else pf("no\n"); 92 } 93 }
每一个不曾起舞的日子,都是对生命的辜负。