这一题,简单的广搜就可以搞定,只是在搜索的时候判断比较麻烦,遇到楼梯的时候,有多种情况,停下来等,或者走其他路,来到楼梯,楼梯是否可以直接上等等的判断。
一开始WR,就是在楼梯可以直接上的时候,没有判断走出楼梯的那一个是否可以走,所以WR了3次。
下面AC的代码:
#include <iostream> #include <queue> using namespace std; class Node { public: int x, y, time; }; int M, N; char map[25][25]; int vis[25][25]; int xy[4][2] = { 0, 1, 0, -1, 1, 0, -1, 0 }; int start_x, start_y, end_x, end_y; queue <Node> que; Node node; int bfs() { int fx, fy; node.x = start_x; node.y = start_y; node.time = 0; que.push(node); while(!que.empty()) { node = que.front(); que.pop(); if(node.x == end_x && node.y == end_y) //到达终点 { return node.time; } for(int i = 0; i < 4; i++) { fx = node.x + xy[i][0]; fy = node.y + xy[i][1]; if(fx >= 0 && fx < M && fy >= 0 && fy < N && map[fx][fy] != '*' && !vis[fx][fy]) { if(map[fx][fy] == '.' || map[fx][fy] == 'T') { Node temp; temp.x = fx; temp.y = fy; temp.time = node.time + 1; que.push(temp); vis[fx][fy] = 1; } else if(map[fx][fy] == '-') //开始楼梯横向 { if(node.time % 2 == 0) //偶数时间 { if(fx == node.x) //判断是否是横向走过来的 { if(node.y + 1 == fy) //向右走 fy = fy + 1; else //向左走 fy = fy - 1; if(fy >= 0 && fy < N && map[fx][fy] != '*' && !vis[fx][fy]) //判断走过楼梯之后的那个是否可以走 { Node temp; temp.x = fx; temp.y = fy; temp.time = node.time + 1; que.push(temp); vis[fx][fy] = 1; } } else //停留等楼梯的情况 { Node temp; temp.x = node.x; temp.y = node.y; temp.time = node.time + 1; que.push(temp); } } else //奇数时间 { if(fy == node.y) //判是否竖向走的 { if(node.x + 1 == fx) //向下走的情况 fx = fx + 1; else //向上的情况 fx = fx - 1; if(fx >= 0 && fx < M && map[fx][fy] != '*' && !vis[fx][fy]) //同上 { Node temp; temp.x = fx; temp.y = fy; temp.time = node.time + 1; que.push(temp); vis[fx][fy] = 1; } } else //停留 { Node temp; temp.x = node.x; temp.y = node.y; temp.time = node.time + 1; que.push(temp); } } } else if(map[fx][fy] == '|') //同上 { if(node.time % 2 == 0) { if(fy == node.y) { if(node.x + 1 == fx) fx = fx + 1; else fx = fx - 1; if(fx >= 0 && fx < M && map[fx][fy] != '*' && !vis[fx][fy]) { Node temp; temp.x = fx; temp.y = fy; temp.time = node.time + 1; que.push(temp); vis[fx][fy] = 1; } } else { Node temp; temp.x = node.x; temp.y = node.y; temp.time = node.time + 1; que.push(temp); } } else { if(fx == node.x) { if(node.y + 1 == fy) fy = fy + 1; else fy = fy - 1; if(fy >= 0 && fy < N && map[fx][fy] != '*' && !vis[fx][fy]) { Node temp; temp.x = fx; temp.y = fy; temp.time = node.time + 1; que.push(temp); vis[fx][fy] = 1; } } else { Node temp; temp.x = node.x; temp.y = node.y; temp.time = node.time + 1; que.push(temp); } } } } } } } int main() { while(cin >> M >> N) { for(int i = 0; i < M; i++) { for(int j = 0; j < N; j++) { cin >> map[i][j]; vis[i][j] = 0; if(map[i][j] == 'S' || map[i][j] == 's') //标记起点的位置 { start_x = i; start_y = j; } if(map[i][j] == 'T' || map[i][j] == 't') //标记终点位置 { end_x = i; end_y = j; } } } vis[start_x][start_y] = 1; while(!que.empty()) { que.pop(); } int ans = bfs(); cout << ans << endl; } return 0; }
时间: 2024-12-12 09:24:03