HDU 1782.逃离迷宫
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 3Sample 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 }
然而,我并不能保证我说的是对的。请自行验证,如有错误,请指正
新博客地址
https://www.oyohyee.com
https://www.oyohyee.com