1 /* 2 BFS:三维BFS,加上方向。用dp[x][y][d]记录当前需要的最少转向数 3 */ 4 #include <cstdio> 5 #include <algorithm> 6 #include <cstring> 7 #include <queue> 8 #include <cmath> 9 using namespace std; 10 11 const int MAXN = 1e2 + 10; 12 const int INF = 0x3f3f3f3f; 13 struct P 14 { 15 int x, y, z; 16 }now, to; 17 char maze[MAXN][MAXN]; 18 int dp[MAXN][MAXN][4]; 19 bool inq[MAXN][MAXN][4]; 20 int dx[4] = {-1, 1, 0, 0}; 21 int dy[4] = {0, 0, -1, 1}; 22 int k, x1, y1, x2, y2; 23 int n, m; 24 25 bool check(int x, int y) 26 { 27 if (x >= 1 && x <= n && y >= 1 && y <= m) return true; 28 else return false; 29 } 30 31 bool BFS(void) 32 { 33 memset (dp, 0, sizeof (dp)); 34 memset (inq, false, sizeof (inq)); 35 queue<P> Q; 36 for (int i=1; i<=n; ++i) 37 { 38 for (int j=1; j<=m; ++j) 39 { 40 for (int l=0; l<4; ++l) 41 { 42 dp[i][j][l] = INF; inq[i][j][l] = false; 43 } 44 } 45 } 46 for (int i=0; i<4; ++i) 47 { 48 dp[x1][y1][i] = 0; inq[x1][y1][i] = true; 49 Q.push ((P) {x1, y1, i}); 50 } 51 52 while (!Q.empty ()) 53 { 54 now = Q.front (); Q.pop (); 55 for (int i=0; i<4; ++i) 56 { 57 to.x = now.x + dx[i]; 58 to.y = now.y + dy[i]; to.z = i; 59 if (check (to.x, to.y) && maze[to.x][to.y] == ‘.‘) 60 { 61 int tmp = dp[now.x][now.y][now.z]; 62 if (to.z == now.z) 63 { 64 if (tmp < dp[to.x][to.y][to.z]) 65 { 66 dp[to.x][to.y][to.z] = tmp; 67 if (!inq[to.x][to.y][to.z]) 68 { 69 inq[to.x][to.y][to.z] = true; Q.push (to); 70 } 71 } 72 } 73 else 74 { 75 if (++tmp < dp[to.x][to.y][to.z]) 76 { 77 dp[to.x][to.y][to.z] = tmp; 78 if (!inq[to.x][to.y][to.z]) 79 { 80 inq[to.x][to.y][to.z] = true; Q.push (to); 81 } 82 } 83 } 84 } 85 } 86 inq[now.x][now.y][now.z] = false; 87 } 88 89 for (int i=0; i<4; ++i) 90 { 91 if (dp[x2][y2][i] <= k) return true; 92 } 93 94 return false; 95 } 96 97 int main(void) //HDOJ 1728 逃离迷宫 98 { 99 // freopen ("HDOJ_1728.in", "r", stdin); 100 101 int t; scanf ("%d", &t); 102 while (t--) 103 { 104 scanf ("%d%d", &n, &m); 105 for (int i=1; i<=n; ++i) scanf ("%s", maze[i] + 1); 106 scanf ("%d%d%d%d%d", &k, &y1, &x1, &y2, &x2); 107 if (BFS ()) puts ("yes"); 108 else puts ("no"); 109 } 110 111 return 0; 112 }
时间: 2024-10-10 20:27:32