社区讨论
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 条回复,欢迎继续交流。
正在加载回复...