社区讨论

快来救救我的屎山代码555

P3930SAC E#1 - 一道大水题 Knight参与者 3已保存回复 2

讨论操作

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

当前回复
2 条
当前快照
1 份
快照标识符
@mhja70g6
此快照首次捕获于
2025/11/03 23:14
4 个月前
此快照最后确认于
2025/11/03 23:14
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
char a[55][55],z[55][55];
struct aa{
	int x,y,t;
};
queue<aa> q;
int dx[]={0,1,1,2,2,-1,-1,-2,-2},dy[]={0,2,-2,1,-1,2,-2,1,-1};
bool vis[55][55]={0};
int main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cin>>a[i][j];
		}
	}
	int sx,sy,wx,wy;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(a[i][j]=='O'){
				sx=i;sy=j;
			}
			if(a[i][j]=='c'){
				for(int k=1;k<=n;k++){
					if(a[i][k]=='.'){
						z[i][k]='#';
					}
					if(a[k][i]=='.'){
						z[k][i]='#';
					}
				}
			}
			if(a[i][j]=='k'){
				if(a[i-1][j-2]=='.')
					z[i-1][j-2]='#';
				if(a[i+1][j-2]=='.')
					z[i+1][j-2]='#';
				if(a[i+1][j+2]=='.')
					z[i+1][j+2]='#';
				if(a[i-1][j+2]=='.')
					z[i-1][j+2]='#';
				if(a[i+2][j-1]=='.')
					z[i+2][j-1]='#';
				if(a[i+2][j+1]=='.')
					z[i+2][j+1]='#';
				if(a[i-2][j+1]=='.')
					z[i-2][j+1]='#';
				if(a[i-2][j-1]=='.')
					z[i-2][j-1]='#';
			}
			if(a[i][j]=='B'){
				int x=i-min(i,j)+1,y=j-min(i,j)+1;
				for(;x<=n;x++){
					for(;y<=n;y++){
						if(a[x][y]=='.'){
							z[x][y]='#';
						}
					}
				}
			}
			if(a[i][j]=='Q'){
				for(int k=1;k<=n;k++){
					if(a[i][k]=='.'){
						z[i][k]='#';
					}
					if(a[k][i]=='.'){
						z[k][i]='#';
					}
				}
				int x=i-min(i,j)+1,y=j-min(i,j)+1;
				for(;x<=n;x++){
					for(;y<=n;y++){
						if(a[x][y]=='.'){
							z[x][y]='#';
						}
					}
				}
			}
			if(a[i][j]=='X'){
				for(int x=i-1;x<=i+1;x++){
					for(int y=j-1;y<=i+1;y++){
						if(a[x][y]=='.'){
							z[x][y]='#';
						}
					}
				}
				wx=i;wy=j;
			}
			if(a[i][j]=='P'){
				if(a[i+1][j-1]=='.'){
					z[i+1][j-1]='#';
				}
				if(a[i+1][j+1]=='.'){
					z[i+1][j-1]='#';
				}
			}
		}
	}
	if(z[sx][sy]=='#'){
		cout<<-1;
		return 0;
	}
	q.push({sx,sy,0});
	while(!q.empty()){
		aa w=q.front();
		q.pop();
		for(int i=1;i<=8;i++){
			int nx=w.x+dx[i],ny=w.y+dy[i];
			if(nx>0&&nx<=n&&ny>0&&ny<=n&&vis[nx][ny]==0&&z[nx][ny]!='#'){
				if(a[nx][ny]=='c'){
					for(int k=1;k<=n;k++){
						if(a[nx][k]=='#'){
							z[nx][k]='.';
						}
						if(a[k][ny]=='#'){
							z[k][ny]='.';
						}
					}
				}
				if(a[nx][ny]=='k'){
					if(a[nx-1][ny-2]=='#')
						z[nx-1][ny-2]='.';
					if(a[nx+1][ny-2]=='#')
						z[nx+1][ny-2]='.';
					if(a[nx+1][ny+2]=='#')
						z[nx+1][ny+2]='.';
					if(a[nx-1][ny+2]=='#')
						z[nx-1][ny+2]='.';
					if(a[nx+2][ny-1]=='#')
						z[nx+2][ny-1]='.';
					if(a[nx+2][ny+1]=='#')
						z[nx+2][ny+1]='.';
					if(a[nx-2][ny+1]=='#')
						z[nx-2][ny+1]='.';
					if(a[nx-2][ny-1]=='#')
						z[nx-2][ny-1]='.';
				}
				if(a[nx][ny]=='B'){
					int x=nx-min(nx,ny)+1,y=ny-min(nx,ny)+1;
					for(;x<=n;x++){
						for(;y<=n;y++){
							if(a[x][y]=='#'){
								z[x][y]='.';
							}
						}
					}
				}
				if(a[nx][ny]=='Q'){
					for(int k=1;k<=n;k++){
						if(a[nx][k]=='#'){
							z[nx][k]='.';
						}
						if(a[k][nx]=='#'){
							z[k][nx]='.';
						}
					}
					int x=nx-min(nx,ny)+1,y=ny-min(nx,ny)+1;
					for(;x<=n;x++){
						for(;y<=n;y++){
							if(a[x][y]=='#'){
								z[x][y]='.';
							}
						}
					}
				}
				if(a[nx][ny]=='X'){
					for(int x=nx-1;x<=nx+1;x++){
						for(int y=ny-1;y<=ny+1;y++){
							if(a[x][y]=='#'){
								z[x][y]='.';
							}
						}
					}
				}
				if(a[nx][ny]=='P'){
					if(a[nx+1][ny-1]=='#'){
						z[nx+1][ny-1]='.';
					}
					if(a[nx+1][ny+1]=='#'){
						z[nx+1][ny-1]='.';
					}
				}
				vis[nx][ny]=1;
				q.push({nx,ny,w.t+1});
				if(nx==wx&&ny==wy){
					cout<<w.t+1;
					return 0;
				}
			}
		}
	}
	cout<<-1;
	return 0;
}

回复

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

正在加载回复...