HDU 1782.逃离迷宫

逃离迷宫
Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

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, x 1, y 1, x 2, y 2 (1 ≤ k ≤ 10, 1 ≤ x 1, x 2 ≤ n, 1 ≤ y 1, y 2 ≤ m),其中k表示gloria最多能转的弯数,(x 1, y 1), (x 2, y 2)表示两个位置,其中x 1,x 2对应列,y 1, y 2对应行。 

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
 
BFS不记录距离,记录转的弯数
套用BFS模板即可
 
 1 /*
 2 By:OhYee
 3 Github:OhYee
 4 Email:oyohyee@oyohyee.com
 5 Blog:http://www.cnblogs.com/ohyee/
 6 
 7 かしこいかわいい?
 8 エリーチカ!
 9 要写出来Хорошо的代码哦~
10 */
11 
12 #include <cstdio>
13 #include <algorithm>
14 #include <cstring>
15 #include <cmath>
16 #include <string>
17 #include <iostream>
18 #include <vector>
19 #include <list>
20 #include <queue>
21 #include <stack>
22 #include <map>
23 using namespace std;
24 
25 //DEBUG MODE
26 #define debug 0
27 
28 //循环
29 #define REP(n) for(int o=0;o<n;o++)
30 
31 const int maxn = 105;
32 int n,m;
33 char Map[maxn][maxn];
34 int dis[maxn][maxn];
35 
36 typedef pair<int,int> point;
37 
38 const int delta[] = {1,-1,0,0};
39 
40 bool BFS(int s1,int s2,int v1,int v2,int k) {
41     if(k < 0)
42         return false;
43     if(s1 == v1 && s2 == v2)
44         return true;
45 
46     memset(dis,-1,sizeof(dis));
47     queue<point> Q;
48 
49     Q.push(point(s1,s2));
50     dis[s1][s2] = 0;
51     while(!Q.empty()) {
52         int x = Q.front().first;
53         int y = Q.front().second;
54         Q.pop();
55 
56         if(dis[x][y] == k+1)
57             return false;
58 
59         REP(4) {
60             int xx,yy;
61             for(int i = 1;;i++) {
62                 xx = x + delta[o] * i;
63                 yy = y + delta[3 - o] * i;
64 
65                 if(xx < 0 || xx > n || yy < 0 || yy > m || Map[xx][yy] == '*')
66                     break;
67                 if(dis[xx][yy] == -1) {
68                     dis[xx][yy] = dis[x][y] + 1;
69                     if(xx == v1 && yy == v2)
70                         return true;
71                     Q.push(point(xx,yy));
72                 }
73 
74 
75             }
76         }
77     }
78     return false;
79 
80 }
81 
82 void Do() {
83     scanf("%d%d",&n,&m);
84     for(int i = 0;i < n;i++)
85         for(int j = 0;j < m;j++)
86             scanf("\n%c\n",&Map[i][j]);
87     int s1,s2,v1,v2,k;
88     scanf("%d%d%d%d%d",&k,&s2,&s1,&v2,&v1);
89 
90     printf("%s\n",BFS(s1 - 1,s2 - 1,v1 - 1,v2 - 1,k) ? "yes" : "no");
91 }
92 
93 int main() {
94     int T;
95     scanf("%d",&T);
96     while(T--)
97         Do();
98     return 0;
99 }

 

posted @ 2016-04-21 11:04  OhYee  阅读(209)  评论(0编辑  收藏  举报