社区讨论
求助BFS,30分,悬关
P1126机器人搬重物参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @lo1uv99e
- 此快照首次捕获于
- 2023/10/23 03:22 2 年前
- 此快照最后确认于
- 2023/11/03 03:52 2 年前
不太清楚错在哪里,求助。
CPP#include <bits/stdc++.h>
using namespace std;
const int N = 55;
int a[N][N];
int n, m;
int si, sj, ti, tj, dir;
// WNES
int dx[] = {0, -1, 0, 1};
int dy[] = {-1, 0, 1, 0};
int ans = -1;
struct node {
int i;
int j;
int dir;
int step;
};
void bfs() {
queue<node> que;
bool vis[N][N][4] = {};
que.push((node){si, sj, dir, 0});
vis[si][sj][dir] = 1;
while (que.size()) {
node x = que.front(); que.pop();
if (x.i == ti && x.j == tj) {
ans = x.step;
return;
}
for (int i=1; i<=3; i++) {
if (vis[x.i+dx[x.dir]][x.j+dy[x.dir]][dir]) continue;
if (!(1<x.i+dx[x.dir] && x.i+dx[x.dir]<n && 1<x.j+dy[x.dir] && x.j+dy[x.dir]<m)) continue;
if (a[x.i+dx[x.dir]][x.j+dy[x.dir]] == 1) continue;
vis[x.i+dx[x.dir]][x.j+dy[x.dir]][dir] = 1;
que.push((node){x.i+dx[x.dir], x.j+dy[x.dir], dir, x.step+1});
}
int j = (x.dir+1)%4;
if (vis[x.i][x.j][j] == 0) {
vis[x.i][x.j][j] = 1;
que.push((node){x.i, x.j, j, x.step+1});
}
j = (x.dir+3)%4;
if (vis[x.i][x.j][j] == 0) {
vis[x.i][x.j][j] = 1;
que.push((node){x.i, x.j, j, x.step+1});
}
}
}
int main() {
cin >> n >> m;
for (int i=1; i<=n; i++) {
for (int j=1; j<=m; j++) {
int x;
cin >> x;
if (x) {
a[i][j] = 1;
a[i+1][j] = 1;
a[i][j+1] = 1;
a[i+1][j+1] = 1;
}
}
}
n++, m++;
cin >> si >> sj >> ti >> tj;
si++, sj++, ti++, tj++;
string temp, fang="WNES";
cin >> temp;
dir = fang.find(temp);
bfs();
cout << ans << endl;
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...