社区讨论

求助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 条回复,欢迎继续交流。

正在加载回复...