这一题,简单的广搜就可以搞定,只是在搜索的时候判断比较麻烦,遇到楼梯的时候,有多种情况,停下来等,或者走其他路,来到楼梯,楼梯是否可以直接上等等的判断。
一开始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;
}