求助玄学问题:本地可过#1提交全错
查看原帖
求助玄学问题:本地可过#1提交全错
1164775
Jadonyzx楼主2024/8/8 10:26
#include<bits/stdc++.h>
#define maxn 65
using namespace std;
const int K=(1<<16)-1;
int ex,ey,sx,sy,n,cnt;
struct node{
	int x,y;
	char typ;
}chess[20];
char mp[maxn][maxn];
int czr[maxn][maxn],ans[maxn][maxn];
int dx[]={ 1,-1, 1,-1, 2,-2, 2,-2};
int dy[]={-2,-2, 2, 2,-1,-1, 1, 1};
struct nd{
	int x,y,s,move;
};
bool check(int nowx,int nowy,int nows){
	int x=nowx,y=nowy,s=nows;
	for(int i=1,j=1;i<=s&&j<=cnt;i<<=1,j++){
		if(!(s&i))continue;
		char op=chess[j].typ;
		int xx=chess[j].x,yy=chess[j].y;
//		if(xx==x&&yy==y)continue;
		if(op=='X')if(abs(xx-x)<=1&&abs(yy-y)<=1)return 0;
		else if(op=='P')if(x==xx+1&&abs(yy-y)==1)return 0;
		else if(op=='K'){
			for(int j=0;j<8;++j){
				int xxx=xx+dx[j];
				int yyy=yy+dy[j];
				if(xxx==x&&yyy==y)return 0;
			}
		}
		else if(op=='C'){
			if(x==xx){
				int kx=xx;int ky=yy;ky--;
				while(ky>y){
					if(czr[kx][ky])if(!((1<<(czr[kx][ky]-1))&s))break;
					ky--;
				}
				if(ky==y)return 0;
				ky=yy;ky++;
				while(ky<y){
					if(czr[kx][ky])if(!((1<<(czr[kx][ky]-1))&s))break;
					ky++;
				}
				if(ky==y)return 0;
			}
			if(y==yy){
				int ky=yy;int kx=xx;kx--;
				while(kx>x){
					if(czr[kx][ky])if(!((1<<(czr[kx][ky]-1))&s))break;
					kx--;
				}
				if(kx==x)return 0;
				kx=xx;kx++;
				while(kx<x){
					if(czr[kx][ky])if(!((1<<(czr[kx][ky]-1))&s))break;
					kx++;
				}
				if(kx==x)return 0;
			}
		}
		else if(op=='B'){
			int kx=xx,ky=yy;
			if(abs(xx-x)!=abs(yy-y))continue;
			int dtx=(xx-x>0)?-1:1;kx+=dtx;
			int dty=(yy-y>0)?-1:1;ky+=dty;
			while((dtx==1?(x>kx):(x<kx))&&(dty==1?(y>ky):(y<ky))){
				if(czr[kx][ky])if(!((1<<(czr[kx][ky]-1))&s))break;
				kx+=dtx;ky+=dty;
			}
			if(kx==x&&ky==y)return 0;
		}
		else if(op=='Q'){
			int kx=xx,ky=yy;
			if(abs(xx-x)!=abs(yy-y))continue;
			int dtx=(xx-x>0)?-1:1;kx+=dtx;
			int dty=(yy-y>0)?-1:1;ky+=dty;
			while((dtx==1?(x>kx):(x<kx))&&(dty==1?(y>ky):(y<ky))){
				if(czr[kx][ky])if(!((1<<(czr[kx][ky]-1))&s))break;
				kx+=dtx;ky+=dty;
			}
			if(kx==x&&ky==y)return 0;
			
			if(x==xx){
				ky=yy;ky--;
				while(ky>y){
					if(czr[kx][ky])if(!((1<<(czr[kx][ky]-1))&s))break;
					ky--;
				}
				if(ky==y)return 0;
				ky=yy;ky++;
				while(ky<y){
					if(czr[kx][ky])if(!((1<<(czr[kx][ky]-1))&s))break;
					ky++;
				}
				if(ky==y)return 0;
			}
			if(y==yy){
				int kx=xx;kx--;
				while(kx>x){
					if(czr[kx][ky])if(!((1<<(czr[kx][ky]-1))&s))break;
					kx--;
				}
				if(kx==x)return 0;
				kx=xx;kx++;
				while(kx<x){
					if(czr[kx][ky])if(!((1<<(czr[kx][ky]-1))&s))break;
					kx++;
				}
				if(kx==x)return 0;
			}
		}
	}
	return 1;
}
void see(){
	return;
	cout<<"\n\n\n";
	for(int i=1;i<=n;++i){
		for(int j=1;j<=n;++j)cout<<(char)((ans[i][j]!=1e9)?ans[i][j]+'0':'N')<<' ';
		cout<<'\n';
	}
}
void init(){
	memset(czr,0,sizeof czr);
	cnt=0;
}
int work(){
	init();
	for(int i=1;i<=n;++i){
		for(int j=1;j<=n;++j){
			cin>>mp[i][j];
			if(mp[i][j]=='O')sx=i,sy=j;
			else chess[++cnt]=(node){i,j,mp[i][j]},czr[i][j]=cnt;
			if(mp[i][j]=='X')ex=i,ey=j;
			ans[i][j]=1e9;
		}
	}
	queue<nd>q;q.push((nd){sx,sy,K,0});
	while(q.size()){
		nd now=q.front();q.pop();
		int x=now.x;int y=now.y;int s=now.s;int mov=now.move;
		ans[x][y]=min(ans[x][y],mov);
		if(x==ex&&y==ey){
			cout<<mov<<'\n';
			see();
			return 0;
		}
		for(int i=0;i<8;++i){
			int tox=x+dx[i];
			int toy=y+dy[i];
			if(tox>0&&toy>0&&tox<=n&&toy<=n){
				bool eat=0;
				if(czr[tox][toy])if(!((1<<(czr[tox][toy]-1))&s))eat=1;
				if(eat){
					s-=(1<<(czr[tox][toy]-1));
					if(check(tox,toy,s))q.push((nd){tox,toy,s,mov+1});
					s+=(1<<(czr[tox][toy]-1));
				}
				else if(check(tox,toy,s))q.push((nd){tox,toy,s,mov+1});
			}
		}
	}
	cout<<-1<<'\n';
	see();
	return 0;
}
signed main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	while(cin>>n){
		work();
	}
	return 0;
}
2024/8/8 10:26
加载中...