Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 12082 | Accepted: 5182 |
Description
Input
Output
Sample Input
2 8 8 ######## #......# #.####.# #.####.# #.####.# #.####.# #...#..# #S#E#### 9 5 ######### #.#.#.#.# S.......E #.#.#.#.# #########
Sample Output
37 5 5 17 17 9
题意:
先沿着左边的墙从 S 一直走,求到达 E 的步数。
再沿着右边的墙从 S 一直走,求到达 E 的步数。
最后求最短路。
分析:
最短路好办,关键是沿着墙走不太好想。
但只要弄懂如何转,这题就容易了。
单就沿着左走看一下:
当前方向 检索顺序
↑ : ← ↑ → ↓
→ : ↑ → ↓ ←
↓ : → ↓ ← ↑
← : ↓ ← ↑ →
如此,规律很明显,假设数组存放方向为 ← ↑ → ↓, 如果当前方向为 ↑, 就从 ← 开始依次遍历,找到可以走的,如果 ← 可以走,就不用再看 ↑ 了。
在DFS时,加一个参数,用来保存当前的方向。
#include <cstdio> #include <cstring> #include <queue> using namespace std; const int INF = 100000000; typedef pair<int, int> P; int t, w, h; char maze[50][50]; int d[50][50]; int sx, sy, gx, gy; int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1}; int dl[][2] = {{0, -1}, {-1, 0}, {0, 1}, {1, 0}}; int dr[][2] = {{0, 1}, {-1, 0}, {0, -1}, {1, 0}}; int dfs(int x, int y, int d0, int step, int dir[][2]) { for (int i = 0; i < 4; i++){ int j = ((d0 - 1 + 4) % 4 + i) % 4; int nx = x + dir[j][0]; int ny = y + dir[j][1]; if (nx == gx && ny == gy) return step + 1; if (nx >= 0 && nx < h && ny >= 0 && ny < w && maze[nx][ny] != '#') return dfs(nx, ny, j, step + 1, dir); } } int bfs() { queue<P> que; for (int i = 0; i < h; i++){ for (int j = 0; j < w; j++){ d[i][j] = INF; } } que.push(P(sx, sy)); d[sx][sy] = 0; while (que.size()){ P p = que.front(); que.pop(); if (p.first == gx && p.second == gy) break; for (int i = 0; i < 4; i++){ int nx = p.first + dx[i], ny = p.second + dy[i]; if (nx >= 0 && nx < h && ny >= 0 && ny < w && maze[nx][ny] != '#' && d[nx][ny] == INF){ que.push(P(nx, ny)); d[nx][ny] = d[p.first][p.second] + 1; } } } return d[gx][gy]; } int main() { int d1, d2; scanf("%d", &t); while (t--){ scanf("%d%d", &w, &h); for (int i = 0; i < h; i++){ scanf("%s", &maze[i]); } for (int i = 0; i < h; i++){ for (int j = 0; j < w; j++){ if (maze[i][j] == 'S'){ sx = i; sy = j; } if (maze[i][j] == 'E'){ gx = i; gy = j; } } } if (sx == 0){ d1 = 3; d2 = 3; } else if (sx == h - 1){ d1 = 1; d2 = 1; } else if (sy == 0){ d1 = 2; d2 = 0; } else if (sy = w - 1){ d1 = 0; d2 = 2; } printf("%d ", dfs(sx, sy, d1, 1, dl)); printf("%d ", dfs(sx, sy, d2, 1, dr)); printf("%d\n", bfs() + 1); } return 0; }