登 录
从大一暑假开始就想A的题,虽然很水的吧...
#include <stdio.h> #include <queue> using namespace std; struct Node { int key; int sx, sy, bx, by; bool operator < (const Node &oth) const { return key > oth.key; } }; const int dir[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}}; // E W S N const char word[4] = {'e', 'w', 's', 'n'}; const char Word[4] = {'E', 'W', 'S', 'N'}; int n, m, _sx, _sy, _bx, _by, _tx, _ty; char mp[21][21]; bool flag[20][20][20][20]; char way[20][20][20][20]; priority_queue<Node> Q; bool bound(int x, int y) { return x >= 0 && x < n && y >= 0 && y < m; } bool BFS() { Node now, nxt; while (!Q.empty()) Q.pop(); memset(flag, 0, sizeof(flag)); now.bx = _bx; now.by = _by; now.sx = _sx; now.sy = _sy; now.key = 0; flag[now.bx][now.by][now.sx][now.sy] = 1; way[now.bx][now.by][now.sx][now.sy] = 'X'; Q.push(now); while (!Q.empty()) { now = Q.top(); Q.pop(); if (now.bx == _tx && now.by == _ty) { _bx = now.bx; _by = now.by; _sx = now.sx; _sy = now.sy; return true; } for (int i = 0; i < 4; i++) { nxt.sx = now.sx + dir[i][0]; nxt.sy = now.sy + dir[i][1]; if (!bound(nxt.sx, nxt.sy) || mp[nxt.sx][nxt.sy] == '#') continue; if (nxt.sx == now.bx && nxt.sy == now.by) { nxt.bx = now.bx + dir[i][0]; nxt.by = now.by + dir[i][1]; nxt.key = 160000; if (!bound(nxt.bx, nxt.by) || mp[nxt.bx][nxt.by] == '#') continue; } else { nxt.bx = now.bx; nxt.by = now.by; nxt.key = 1; } if (flag[nxt.bx][nxt.by][nxt.sx][nxt.sy]) continue; nxt.key += now.key; flag[nxt.bx][nxt.by][nxt.sx][nxt.sy] = 1; way[nxt.bx][nxt.by][nxt.sx][nxt.sy] = (now.bx == nxt.bx && now.by == nxt.by) ? word[i] : Word[i]; Q.push(nxt); } } return false; } void FindPath(int bx, int by, int sx, int sy) { char c = way[bx][by][sx][sy]; switch (way[bx][by][sx][sy]) { case 'e': FindPath(bx, by, sx - dir[0][0], sy - dir[0][1]); break; case 'w': FindPath(bx, by, sx - dir[1][0], sy - dir[1][1]); break; case 's': FindPath(bx, by, sx - dir[2][0], sy - dir[2][1]); break; case 'n': FindPath(bx, by, sx - dir[3][0], sy - dir[3][1]); break; case 'E': FindPath(bx - dir[0][0], by - dir[0][1], sx - dir[0][0], sy - dir[0][1]); break; case 'W': FindPath(bx - dir[1][0], by - dir[1][1], sx - dir[1][0], sy - dir[1][1]); break; case 'S': FindPath(bx - dir[2][0], by - dir[2][1], sx - dir[2][0], sy - dir[2][1]); break; case 'N': FindPath(bx - dir[3][0], by - dir[3][1], sx - dir[3][0], sy - dir[3][1]); break; case 'X': return; } printf("%c", way[bx][by][sx][sy]); } int main() { int cas = 1; while (scanf("%d %d", &n, &m), n || m) { getchar(); for (int i = 0; i < n; i++) { gets(mp[i]); } for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (mp[i][j] == 'S') _sx = i, _sy = j; else if (mp[i][j] == 'B') _bx = i, _by = j; else if (mp[i][j] == 'T') _tx = i, _ty = j; } } printf("Maze #%d/n", cas++); if (BFS()) FindPath(_bx, _by, _sx, _sy); else printf("Impossible."); printf("/n/n"); } return 0; }
抱歉!评论已关闭.