HDU 1728 逃离迷宫(bfs)

逃离迷宫



 

Problem Description
  给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地方是障碍,她必须绕行,从迷宫的一个位置,只能走到与它相邻的4个位置中,当然在行走过程中,gloria不能走到迷宫外面去。令人头痛的是,gloria是个没什么方向感的人,因此,她在行走过程中,不能转太多弯了,否则她会晕倒的。我们假定给定的两个位置都是空地,初始时,gloria所面向的方向未定,她可以选择4个方向的任何一个出发,而不算成一次转弯。gloria能从一个位置走到另外一个位置吗?
 

 

Input
  第1行为一个整数t (1 ≤ t ≤ 100),表示测试数据的个数,接下来为t组测试数据,每组测试数据中,
  第1行为两个整数m, n (1 ≤ m, n ≤ 100),分别表示迷宫的行数和列数,接下来m行,每行包括n个字符,其中字符'.'表示该位置为空地,字符'*'表示该位置为障碍,输入数据中只有这两种字符,每组测试数据的最后一行为5个整数k, x1, y1, x2, y2 (1 ≤ k ≤ 10, 1 ≤ x1, x2 ≤ n, 1 ≤ y1, y2 ≤ m),其中k表示gloria最多能转的弯数,(x1, y1), (x2, y2)表示两个位置,其中x1,x2对应列,y1, y2对应行。
 

 

Output
  每组测试数据对应为一行,若gloria能从一个位置走到另外一个位置,输出“yes”,否则输出“no”。
 

 

Sample Input
2
5 5
...**
*.**.
.....
.....
*....
1 1 1 1 3
5 5
...**
*.**.
.....
.....
*....
2 1 1 1 3
 
 

 

Sample Output
no
yes
 
 1 #include<cstdio>
 2 #include<queue>
 3 #include<cstring>
 4 using namespace std;
 5 
 6 struct point
 7 {
 8     int x,y;
 9     int cnt;
10 };
11 
12 char map[105][105];
13 int m,n,ex,ey,sx,sy,lim;
14 int vis[105][105];
15 int d[4][2]={0,1,1,0,-1,0,0,-1};
16 
17 bool bfs(int x,int y)
18 {
19     queue<point>q;
20     point init;
21     init.x=x,init.y=y;
22     init.cnt=-1;
23     vis[x][y]=1;
24     q.push(init);
25     while(!q.empty())
26     {
27         point t1,t2;
28         t1=q.front();
29         q.pop();
30         if(t1.cnt>=lim)
31         continue;
32         for(int i=0;i<4;i++)
33         {
34             t2.x=t1.x+d[i][0];
35             t2.y=t1.y+d[i][1];
36             t2.cnt=t1.cnt+1;
37             while(1)
38             {
39                 if(map[t2.x][t2.y]=='*'||t2.x<=0||t2.x>m||t2.y<=0||t2.y>n)
40                 break;
41                 if(t2.x==ex&&t2.y==ey)
42                   return true;
43                 if(!vis[t2.x][t2.y])
44                 {
45                     q.push(t2);
46                     vis[t2.x][t2.y]=1;
47                 }
48                 t2.x+=d[i][0];
49                 t2.y+=d[i][1];
50             }
51         }
52     }
53     return false;
54 }
55 
56 int main()
57 {
58     //freopen("in.txt","r",stdin);
59     int t;
60     scanf("%d",&t);
61     while(t--)
62     {
63         memset(vis,0,sizeof(vis));
64         scanf("%d%d",&m,&n);
65         for(int i=1;i<=m;i++)
66         {
67             getchar();
68             for(int j=1;j<=n;j++)
69             scanf("%c",&map[i][j]);
70         }
71         scanf("%d%d%d%d%d",&lim,&sy,&sx,&ey,&ex);
72         if(bfs(sx,sy))
73         printf("yes
");
74         else
75         printf("no
");
76     }
77     return 0;
78 }
原文地址:https://www.cnblogs.com/homura/p/4708248.html