HDU 1728 逃离迷宫【BFS】

题意:给一个图。规定至多转弯的次数,起点和终点。问在转弯的次数内能否到达终点。
注意!给的n*m的map,n是列,m是行。 同一个点可能经过多次。由于只统计拐弯次数,会出现走的步数少但拐弯多的情况。
 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #include <queue>
 5 #include <vector>
 6 using namespace std;
 7 typedef long long LL;
 8 
 9 const int INF = 0x3f3f3f3f;
10 
11 int k,n,m;
12 char map[110][110];
13 int vis[110][110]; //该点的转弯次数
14 int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
15 struct node
16 {
17     int x,y;
18     int times; // 转弯次数
19     int dir;   // 当前方向
20 };
21 
22 int bfs(node s,node e) {
23     s.dir=-1;
24     s.times=0;
25     queue<node> q;
26     q.push(s);
27     vis[s.y][s.x] = 0;
28     while (!q.empty())
29     {
30         node cur = q.front();q.pop();
31         if(cur.x == e.x && cur.y == e.y && cur.times<=k)return 1;
32         for(int i=0;i<4;i++)
33         {
34             node tmp;
35             tmp.x = cur.x+ dir[i][0];
36             tmp.y = cur.y+ dir[i][1];
37             tmp.dir = i;
38             if(cur.dir==-1)tmp.times=0;
39             else if(cur.dir!=tmp.dir)tmp.times=cur.times+1;
40             else tmp.times=cur.times;
41             //check条件
42             if(tmp.x >= 1 && tmp.y >= 1 && tmp.x <= n && tmp.y <= m && tmp.times <=k && tmp.times <= vis[tmp.y][tmp.x] && map[tmp.y][tmp.x]=='.')
43             {
44                 q.push(tmp);
45                 vis[tmp.y][tmp.x]=tmp.times; // 记录更小的转弯次数
46             }
47         }
48     }
49     return 0;
50 }
51 
52 int main()
53 {
54     int t;
55     scanf("%d",&t);
56     while(t--){
57         scanf("%d%d",&m,&n);
58         for(int i=1;i<=m;i++)
59         {
60             getchar();
61             for (int j = 1; j <= n; ++j) {
62                 scanf("%c",&map[i][j]);
63                 vis[i][j]=0x3f3f3f3f;
64             }
65         }
66         node s,e;
67         scanf("%d%d%d%d%d",&k,&s.x,&s.y,&e.x,&e.y);
68         if(bfs(s,e))printf("yes\n");
69         else printf("no\n");
70     }
71     return 0;
72 }

猜你喜欢

转载自www.cnblogs.com/demian/p/9236104.html