社区讨论

80 分求 hack

P2199最后的迷宫参与者 3已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@lo1ttjkw
此快照首次捕获于
2023/10/23 02:52
2 年前
此快照最后确认于
2023/11/03 03:26
2 年前
查看原帖
rt,不用管 RE,因为有一个点 WA 了,求 hack。
CPP
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
struct node {
	int x,y;
};
int n,m,ans[1005][1005];
char a[1005][1005];
bool vis[1005][1005];
const int dx[] = {0,0,1,-1};
const int dy[] = {1,-1,0,0};
queue<node> q;
void Light(int x,int y) {
	//奖杯在(x,y),使周围发光
	//八个方向
	//1.↑
	for(int i = x;i >= 1;i--) {
		if(a[i][y] == 'X') break;
		a[i][y] = 'S';
	}
	//2.↓
	for(int i = x;i <= n;i++) {
		if(a[i][y] == 'X') break;
		a[i][y] = 'S';
	}
	//3.←
	for(int i = y;i >= 1;i--) {
		if(a[x][i] == 'X') {
			break;
		}
		a[x][i] = 'S';
	}
	//4.→
	for(int i = y;i <= m;i++) {
		if(a[x][i] == 'X') break;
		a[x][i] = 'S';
	}
	//5.↖
	for(int i = 1;i <= min(x-1,y-1);i++) {
		int nx = x - i,ny = y - i;
		if(a[nx][ny] == 'X') break;
		a[nx][ny] = 'S';
	}
	//6.↘
	for(int i = 1;i <= min(n-x,m-y);i++) {
		int nx = x + i,ny = y + i;
		if(a[nx][ny] == 'X') break;
		a[nx][ny] = 'S';
	}
	//7.↗
	for(int i = 1;i <= min(x-1,m-y);i++) {
		int nx = x - i,ny = y + i;
		if(a[nx][ny] == 'X') break;
		a[nx][ny] = 'S';
	}
	//8.↙
	for(int i = 1;i <= min(x-1,m-y);i++) {
		int nx = x + i,ny = y - i;
		if(a[nx][ny] == 'X') break;
		a[nx][ny] = 'S';
	}
}
void Restore() {
	for(int i = 1;i <= n;i++)
		for(int j = 1;j <= m;j++)
			if(a[i][j] == 'S')
				a[i][j] = 'O';
}
bool Check(int x,int y) {
	return x >= 1 && x <= n && y >= 1 && y <= m && !vis[x][y] && a[x][y] != 'X' && ans[x][y] == -1;
}
int main() {
	cin >> n >> m;
	for(int i = 1;i <= n;i++)
		for(int j = 1;j <= m;j++)
			cin >> a[i][j];
	while(true) {
		int tx,ty,sx,sy; cin >> tx >> ty >> sx >> sy;
		if(tx == 0 && ty == 0 && sx == 0 && sy == 0) break;
		memset(vis,false,sizeof vis);
		memset(ans,-1,sizeof ans);
		while(!q.empty()) q.pop();
		Light(tx,ty);
		for(int i = 1;i <= n;i++)
			cout << a[i]+1 << endl;
		q.push({sx,sy});
		vis[sx][sy] = true;
		ans[sx][sy] = 0;
		bool flag = false;
		
		while(!q.empty()) {
			node u = q.front();
			q.pop();
			int x = u.x,y = u.y;
			if(a[x][y] == 'S') {
				cout << ans[x][y] << endl;
				flag = true;
				break;
			}
			for(int i = 0;i < 4;i++) {
				int nx = x + dx[i],ny = y + dy[i];
				if(!Check(nx,ny)) continue;
				vis[nx][ny] = true;
				ans[nx][ny] = ans[x][y] + 1;
				q.push({nx,ny});
			}
		}
		if(!flag) cout << "Poor Harry" << endl;
		Restore();
	}
	return 0;
}
如有大佬愿意解答,蒟蒻感激不尽

回复

5 条回复,欢迎继续交流。

正在加载回复...