社区讨论
屎山代码求调(玄关)
AT_abc420_d[ABC420D] Toggle Maze参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @mhjd1h1j
- 此快照首次捕获于
- 2025/11/04 00:34 4 个月前
- 此快照最后确认于
- 2025/11/04 00:34 4 个月前
自己写的代码给自己整笑了,atcoder那边换了个思路过了但想看看这个思路能不能活
CPP#include<bits/stdc++.h>
#define mk make_pair
#define st first
#define nd second
using namespace std;
queue<pair<int,pair<int,pair<int,int> > > > q;
char maze[505][505];
int gx,gy;
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
int main(){
int H,W;
cin>>H>>W;
for(int i=1;i<=H;i++){
for(int j=1;j<=W;j++){
cin>>maze[i][j];
if(maze[i][j]=='S') q.push(mk(i,mk(j,mk(1,0))));
if(maze[i][j]=='G') gx=i,gy=j;
}
}
int cnt_break=0,nx,ny,nr,ns;
while(!q.empty()){
cnt_break++;
nx = q.front().st;
ny = q.front().nd.st;
nr = q.front().nd.nd.st;
ns = q.front().nd.nd.nd;
for(int i=0;i<4;i++){
if(maze[nx+dir[i][0]][ny+dir[i][1]]=='#') continue;
if(nr==1&&nx+dir[i][0]<=H&&ny+dir[i][1]<=W){
if(maze[nx+dir[i][0]][ny+dir[i][1]]=='x') continue;
if(maze[nx+dir[i][0]][ny+dir[i][1]]=='?') q.push(mk(nx+dir[i][0],mk(ny+dir[i][1],mk(0,ns+1))));
if(maze[nx+dir[i][0]][ny+dir[i][1]]=='o') q.push(mk(nx+dir[i][0],mk(ny+dir[i][1],mk(1,ns+1))));
if(maze[nx+dir[i][0]][ny+dir[i][1]]=='.') q.push(mk(nx+dir[i][0],mk(ny+dir[i][1],mk(1,ns+1))));
if(maze[nx+dir[i][0]][ny+dir[i][1]]=='G'){
cout<<ns+1<<'\n';
return 0;
}
}
if(nr==0&&nx+dir[i][0]<=H&&ny+dir[i][1]<=W){
if(maze[nx+dir[i][0]][ny+dir[i][1]]=='o') continue;
if(maze[nx+dir[i][0]][ny+dir[i][1]]=='?') q.push(mk(nx+dir[i][0],mk(ny+dir[i][1],mk(1,ns+1))));
if(maze[nx+dir[i][0]][ny+dir[i][1]]=='x') q.push(mk(nx+dir[i][0],mk(ny+dir[i][1],mk(0,ns+1))));
if(maze[nx+dir[i][0]][ny+dir[i][1]]=='.') q.push(mk(nx+dir[i][0],mk(ny+dir[i][1],mk(0,ns+1))));
if(maze[nx+dir[i][0]][ny+dir[i][1]]=='G'){
cout<<ns+1<<'\n';
return 0;
}
}
}
q.pop();
}
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...