社区讨论

屎山代码求调(玄关)

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

正在加载回复...