hdu 1728 逃离迷宫 (bfs)

逃离迷宫

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 12910    Accepted Submission(s): 3090


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
 
Source
 
Recommend
lcy   |   We have carefully selected several similar problems for you:  1175 1072 1026 1180 1254 
 1 //31MS    420K    1366 B    G++
 2 /*
 3 
 4     题意:
 5         是否在转n个弯内重一点到达另一点。
 6         
 7     bfs:
 8         WA了n次,主要是考虑策略时想法错了。
 9         其实每到一个点时就应该把改点以及该方向的点全都遍历一次,这样才能保证
10     到达改点时是最优策略,其次,因为交叉关系,vis[][]应该放在while判断里面。 
11 
12 */
13 #include<stdio.h>
14 #include<string.h>
15 #include<iostream>
16 #include<algorithm>
17 #include<queue>
18 #define N 105
19 using namespace std;
20 struct node{
21     int x,y;
22     int step; 
23 };
24 char g[N][N];
25 int vis[N][N];
26 int mov[4][2]={0,1,1,0,0,-1,-1,0};
27 int k,x1,x2,y1,y2;
28 int n,m;
29 int bfs()
30 {
31     queue<node>Q;
32     node t={x1,y1,-1};
33     Q.push(t);
34     vis[x1][y1]=1;
35     while(!Q.empty()){
36         t=Q.front();
37         Q.pop();
38         //printf("%d %d %d
",t.x,t.y,t.step);
39         if(t.x==x2 && t.y==y2 && t.step<=k) return 1;
40         t.step;
41         for(int i=0;i<4;i++){
42             node tt=t;
43             tt.step++;
44             tt.x+=mov[i][0];
45             tt.y+=mov[i][1];
46             while(tt.x>0 && tt.x<=n && tt.y>0 & tt.y<=m && g[tt.x][tt.y]!='*' ){
47                 if(!vis[tt.x][tt.y]){
48                     vis[tt.x][tt.y]=1;
49                     Q.push(tt);
50                 }
51                 tt.x+=mov[i][0];
52                 tt.y+=mov[i][1];
53             }
54         }
55     }  
56     return 0;
57 }
58 int main(void)
59 {
60     int t;
61     scanf("%d",&t);
62     while(t--)
63     {
64         memset(vis,0,sizeof(vis));
65         scanf("%d%d",&n,&m);
66         for(int i=1;i<=n;i++)
67             scanf("%s",g[i]+1);
68         scanf("%d%d%d%d%d",&k,&y1,&x1,&y2,&x2);
69         if(bfs()) puts("yes");
70         else puts("no");
71     }
72     return 0;
73 }
原文地址:https://www.cnblogs.com/GO-NO-1/p/3601163.html