P1126 机器人搬重物
一道又简单又难的BFS题
这道题是个人看上去就知道要BFS。
随手写了个BFS,算样例的答案是7?
翻题解发现:障碍点不能跳过!
改过来,终于是12了。交上去,MLE!
显然会有很多状态是重复的,我们可以开一个三维的布尔数组来判重,很傻瓜的操作。
应该改完了,交上去,还有TLE?
哦,我还添加少了vis标记,再慢慢地复制粘贴。
最后的一个错的点居然WA了?
看讨论区的dalao说要先转向再走路,试着改了一下,就对了。。。
这道题给我的提醒:
玩BFS一定要注意判重!
连续的走如果可以一次性完成,但也不能跳过任何的障碍!
代码:
#include<cstdio>
#include<cstdlib>
#include<queue>
const int maxn = 55;
int a[maxn][maxn];
bool vis[maxn][maxn][5];
struct Nodes
{
int x, y; char dir; int dis;
};
int n, m;
int sx, sy, tx, ty;
int id(char x)
{
if(x == 'N') return 1;
else if(x == 'S') return 2;
else if(x == 'W') return 3;
else if(x == 'E') return 4;
else return 0;
}
bool check(int x, int y, int idx)
{
bool flag1 = (x >= 1 && x < n && y >= 1 && y < m);
bool flag2 = (a[x][y] || a[x + 1][y] || a[x][y + 1] || a[x + 1][y + 1]);
bool flag3 = vis[x][y][idx];
if(flag1 && !flag2 && !flag3) return true;
return false;
}
int bfs(int sx, int sy, char dir)
{
std::queue<Nodes> q;
if(!check(sx, sy, id(dir))) return -1;
q.push((Nodes){sx, sy, dir, 0});
vis[sx][sy][id(dir)] = true;
while(!q.empty())
{
Nodes node = q.front(); q.pop();
int x = node.x, y = node.y; char dir = node.dir; int dis = node.dis;
if(x == tx && y == ty)
{
return dis;
}
if(dir == 'N')
{
if(!vis[x][y][id('E')])
{
q.push((Nodes){x, y, 'E', dis + 1});
vis[x][y][id('E')] = true;
}
if(!vis[x][y][id('W')])
{
q.push((Nodes){x, y, 'W', dis + 1});
vis[x][y][id('W')] = true;
}
for(int i = 1; i <= 3; i++)
{
int nx = x - i, ny = y;
if(check(nx, ny, id(dir)))
{
q.push((Nodes){nx, ny, dir, dis + 1});
vis[nx][ny][id(dir)] = true;
}
else break;
}
}
else if(dir == 'E')
{
if(!vis[x][y][id('N')])
{
q.push((Nodes){x, y, 'N', dis + 1});
vis[x][y][id('N')] = true;
}
if(!vis[x][y][id('S')])
{
q.push((Nodes){x, y, 'S', dis + 1});
vis[x][y][id('S')] = true;
}
for(int i = 1; i <= 3; i++)
{
int nx = x, ny = y + i;
if(check(nx, ny, id(dir)))
{
q.push((Nodes){nx, ny, dir, dis + 1});
vis[nx][ny][id(dir)] = true;
}
else break;
}
}
else if(dir == 'S')
{
if(!vis[x][y][id('E')])
{
q.push((Nodes){x, y, 'E', dis + 1});
vis[x][y][id('E')] = true;
}
if(!vis[x][y][id('W')])
{
q.push((Nodes){x, y, 'W', dis + 1});
vis[x][y][id('W')] = true;
}
for(int i = 1; i <= 3; i++)
{
int nx = x + i, ny = y;
if(check(nx, ny, id(dir)))
{
q.push((Nodes){nx, ny, dir, dis + 1});
vis[nx][ny][id(dir)] = true;
}
else break;
}
}
else if(dir == 'W')
{
if(!vis[x][y][id('N')])
{
q.push((Nodes){x, y, 'N', dis + 1});
vis[x][y][id('N')] = true;
}
if(!vis[x][y][id('S')])
{
q.push((Nodes){x, y, 'S', dis + 1});
vis[x][y][id('S')] = true;
}
for(int i = 1; i <= 3; i++)
{
int nx = x, ny = y - i;
if(check(nx, ny, id(dir)))
{
q.push((Nodes){nx, ny, dir, dis + 1});
vis[nx][ny][id(dir)] = true;
}
else break;
}
}
}
return -1;
}
int main()
{
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++) for(int j = 1; j <= m; j++) scanf("%d", &a[i][j]);
char dir;
scanf("%d%d%d%d %c", &sx, &sy, &tx, &ty, &dir);
printf("%d\n", bfs(sx, sy, dir));
return 0;
}