社区讨论

求调,405行代码,玄一关

P5380[THUPC 2019] 鸭棋参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@min3gqqz
此快照首次捕获于
2025/12/01 19:57
3 个月前
此快照最后确认于
2025/12/01 20:22
3 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
int n,xs,ys,xt,yt;
bool rb,die;
int qi[10][9];
bool pd_in_qi(int x,int y){
	if(x<0||x>9||y<0||y>8) return 0;
	return 1;
}
string zhi[2]={"red","blue"};
string tiao[14]={"captain   ","guard     ","elephant  ","horse     ","car       ","duck      ","soldier   ","captain   ","guard     ","elephant  ","horse     ","car       ","duck      ","soldier   "};
string qizi[14]={"captain","guard","elephant","horse","car","duck","soldier","captain","guard","elephant","horse","car","duck","soldier"};
//红:0-captain  1-guard  2-elephant  3-horse  4-car  5-duck  6-soldier
//蓝:7-captain  8-guard  9-elephant  10-horse 11-car 12-duck 13-soldier
bool check_captain(int x,int y,int mm){
	if(mm==1) if((pd_in_qi(x+1,y)&&qi[x+1][y]==0)||(pd_in_qi(x-1,y)&&qi[x-1][y]==0)||(pd_in_qi(x,y+1)&&qi[x][y+1]==0)||(pd_in_qi(x,y-1)&&qi[x][y-1]==0)) return 1;
	if(mm==0) if((pd_in_qi(x+1,y)&&qi[x+1][y]==7)||(pd_in_qi(x-1,y)&&qi[x-1][y]==7)||(pd_in_qi(x,y+1)&&qi[x][y+1]==7)||(pd_in_qi(x,y-1)&&qi[x][y-1]==7)) return 1;
	return 0;
}
bool check_guard(int x,int y,int mm){
	if(mm==1) if((pd_in_qi(x+1,y+1)&&qi[x+1][y+1]==0)||(pd_in_qi(x-1,y-1)&&qi[x-1][y-1]==0)||(pd_in_qi(x-1,y+1)&&qi[x-1][y+1]==0)||(pd_in_qi(x+1,y-1)&&qi[x+1][y-1]==0)) return 1;
	if(mm==0) if((pd_in_qi(x+1,y+1)&&qi[x+1][y+1]==7)||(pd_in_qi(x-1,y-1)&&qi[x-1][y-1]==7)||(pd_in_qi(x-1,y+1)&&qi[x-1][y+1]==7)||(pd_in_qi(x+1,y-1)&&qi[x+1][y-1]==7)) return 1;
	return 0;
}
bool check_elephant(int x,int y,int mm){
	if(mm==1) if((pd_in_qi(x+2,y+2)&&qi[x+1][y+1]==-1&&qi[x+2][y+2]==0)||(pd_in_qi(x-2,y-2)&&qi[x-1][y-1]==-1&&qi[x-2][y-2]==0)||(pd_in_qi(x-2,y+2)&&qi[x-1][y+1]==-1&&qi[x-2][y+2]==0)||(pd_in_qi(x+2,y-2)&&qi[x+1][y-1]==-1&&qi[x+2][y-2]==0)) return 1;
	if(mm==0) if((pd_in_qi(x+2,y+2)&&qi[x+1][y+1]==-1&&qi[x+2][y+2]==7)||(pd_in_qi(x-2,y-2)&&qi[x-1][y-1]==-1&&qi[x-2][y-2]==7)||(pd_in_qi(x-2,y+2)&&qi[x-1][y+1]==-1&&qi[x-2][y+2]==7)||(pd_in_qi(x+2,y-2)&&qi[x+1][y-1]==-1&&qi[x+2][y-2]==7)) return 1;
	return 0;
}
bool check_horse(int x,int y,int mm){
	if(mm==1) if((pd_in_qi(x+2,y+1)&&qi[x+1][y]==-1&&qi[x+2][y+1]==0)||(pd_in_qi(x-2,y-1)&&qi[x-1][y]==-1&&qi[x-2][y-1]==0)||(pd_in_qi(x-1,y+2)&&qi[x][y+1]==-1&&qi[x-1][y+2]==0)||(pd_in_qi(x+1,y-2)&&qi[x][y-1]==-1&&qi[x+1][y-2]==0)||(pd_in_qi(x+2,y-1)&&qi[x+1][y]==-1&&qi[x+2][y-1]==0)||(pd_in_qi(x-2,y+1)&&qi[x-1][y]==-1&&qi[x-2][y+1]==0)||(pd_in_qi(x-1,y-2)&&qi[x][y-1]==-1&&qi[x-1][y-2]==0)||(pd_in_qi(x+1,y+2)&&qi[x][y+1]==-1&&qi[x+1][y+2]==0)) return 1;
	if(mm==0) if((pd_in_qi(x+2,y+1)&&qi[x+1][y]==-1&&qi[x+2][y+1]==7)||(pd_in_qi(x-2,y-1)&&qi[x-1][y]==-1&&qi[x-2][y-1]==7)||(pd_in_qi(x-1,y+2)&&qi[x][y+1]==-1&&qi[x-1][y+2]==7)||(pd_in_qi(x+1,y-2)&&qi[x][y-1]==-1&&qi[x+1][y-2]==7)||(pd_in_qi(x+2,y-1)&&qi[x+1][y]==-1&&qi[x+2][y-1]==7)||(pd_in_qi(x-2,y+1)&&qi[x-1][y]==-1&&qi[x-2][y+1]==7)||(pd_in_qi(x-1,y-2)&&qi[x][y-1]==-1&&qi[x-1][y-2]==7)||(pd_in_qi(x+1,y+2)&&qi[x][y+1]==-1&&qi[x+1][y+2]==7)) return 1;
	return 0;
}
bool check_car(int x,int y,int mm){
	int pp=(mm==0)?7:0;
	for(int j=y+1;j<=8;++j){
		if(qi[x][j]!=-1){
			if(qi[x][j]==pp) return 1;
			break;
		}
	}
	for(int j=y-1;j>=0;--j){
		if(qi[x][j]!=-1){
			if(qi[x][j]==pp) return 1;
			break;
		}
	}
	for(int j=x+1;j<=9;++j){
		if(qi[j][y]!=-1){
			if(qi[j][y]==pp) return 1;
			break;
		}
	}
	for(int j=x-1;j>=0;--j){
		if(qi[j][y]!=-1){
			if(qi[j][y]==pp) return 1;
			break;
		}
	}
	return 0;
}
bool check_duck(int x,int y,int mm){
	if(mm==1) if((pd_in_qi(x+3,y+2)&&qi[x+1][y]==-1&&qi[x+2][y+1]==-1&&qi[x+3][y+2]==0)||(pd_in_qi(x-3,y-2)&&qi[x-1][y]==-1&&qi[x-2][y-1]==-1&&qi[x-3][y-2]==0)||(pd_in_qi(x-2,y+3)&&qi[x][y+1]==-1&&qi[x-1][y+2]==-1&&qi[x-2][y+3]==0)||(pd_in_qi(x+2,y-3)&&qi[x][y-1]==-1&&qi[x+1][y-2]==-1&&qi[x+2][y-3]==0)||(pd_in_qi(x+3,y-2)&&qi[x+1][y]==-1&&qi[x+2][y-1]==-1&&qi[x+3][y-2]==0)||(pd_in_qi(x-3,y+2)&&qi[x-1][y]==-1&&qi[x-2][y+1]==-1&&qi[x-3][y+2]==0)||(pd_in_qi(x-2,y-3)&&qi[x][y-1]==-1&&qi[x-1][y-2]==-1&&qi[x-2][y-3]==0)||(pd_in_qi(x+2,y+3)&&qi[x][y+1]==-1&&qi[x+1][y+2]==-1&&qi[x+2][y+3]==0)) return 1;
	if(mm==0) if((pd_in_qi(x+3,y+2)&&qi[x+1][y]==-1&&qi[x+2][y+1]==-1&&qi[x+3][y+2]==7)||(pd_in_qi(x-3,y-2)&&qi[x-1][y]==-1&&qi[x-2][y-1]==-1&&qi[x-3][y-2]==7)||(pd_in_qi(x-2,y+3)&&qi[x][y+1]==-1&&qi[x-1][y+2]==-1&&qi[x-2][y+3]==7)||(pd_in_qi(x+2,y-3)&&qi[x][y-1]==-1&&qi[x+1][y-2]==-1&&qi[x+2][y-3]==7)||(pd_in_qi(x+3,y-2)&&qi[x+1][y]==-1&&qi[x+2][y-1]==-1&&qi[x+3][y-2]==7)||(pd_in_qi(x-3,y+2)&&qi[x-1][y]==-1&&qi[x-2][y+1]==-1&&qi[x-3][y+2]==7)||(pd_in_qi(x-2,y-3)&&qi[x][y-1]==-1&&qi[x-1][y-2]==-1&&qi[x-2][y-3]==7)||(pd_in_qi(x+2,y+3)&&qi[x][y+1]==-1&&qi[x+1][y+2]==-1&&qi[x+2][y+3]==7)) return 1;
	return 0;
}
bool check_soldier(int x,int y,int mm){
	if(mm==1) if((pd_in_qi(x+1,y+1)&&qi[x+1][y+1]==0)||(pd_in_qi(x-1,y-1)&&qi[x-1][y-1]==0)||(pd_in_qi(x-1,y+1)&&qi[x-1][y+1]==0)||(pd_in_qi(x+1,y-1)&&qi[x+1][y-1]==0)||(pd_in_qi(x,y+1)&&qi[x][y+1]==0)||(pd_in_qi(x,y-1)&&qi[x][y-1]==0)||(pd_in_qi(x-1,y)&&qi[x-1][y]==0)||(pd_in_qi(x+1,y)&&qi[x+1][y]==0)) return 1;
	if(mm==0) if((pd_in_qi(x+1,y+1)&&qi[x+1][y+1]==7)||(pd_in_qi(x-1,y-1)&&qi[x-1][y-1]==7)||(pd_in_qi(x-1,y+1)&&qi[x-1][y+1]==7)||(pd_in_qi(x+1,y-1)&&qi[x+1][y-1]==7)||(pd_in_qi(x,y+1)&&qi[x][y+1]==7)||(pd_in_qi(x,y-1)&&qi[x][y-1]==7)||(pd_in_qi(x-1,y)&&qi[x-1][y]==7)||(pd_in_qi(x+1,y)&&qi[x+1][y]==7)) return 1;
	return 0;
}
int main(){
//	freopen("mf.in","r",stdin);
//	freopen("mf.out","w",stdout);
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n;
	rb=0;
	memset(qi,-1,sizeof(qi));
	qi[0][4]=0,qi[0][3]=qi[0][5]=1,qi[0][2]=qi[0][6]=2,qi[0][1]=qi[0][7]=3,qi[0][0]=qi[0][8]=4,qi[2][0]=qi[2][8]=5,qi[3][0]=qi[3][2]=qi[3][4]=qi[3][6]=qi[3][8]=6;
	qi[9][4]=7,qi[9][3]=qi[9][5]=8,qi[9][2]=qi[9][6]=9,qi[9][1]=qi[9][7]=10,qi[9][0]=qi[9][8]=11,qi[7][0]=qi[7][8]=12,qi[6][0]=qi[6][2]=qi[6][4]=qi[6][6]=qi[6][8]=13;
	for(int i=1;i<=n;++i){
		cin>>xs>>ys>>xt>>yt;
		if(die){
			cout<<"Invalid command\n";
			continue;
		}
		if((!pd_in_qi(xs,ys))||(!pd_in_qi(xt,yt))||qi[xs][ys]==-1||(xs==xt&&ys==yt)){
			cout<<"Invalid command\n";
			continue;
		}
		if(((qi[xs][ys]>=0&&qi[xs][ys]<=6)&&(qi[xt][yt]>=0&&qi[xt][yt]<=6))||((qi[xs][ys]>6)&&(qi[xt][yt]>6))){
			cout<<"Invalid command\n";
			continue;
		}
		if(rb==0){
			if(qi[xs][ys]>6){
				cout<<"Invalid command\n";
				continue;
			}
		}
		if(rb==1){
			if(qi[xs][ys]>=0&&qi[xs][ys]<=6){
				cout<<"Invalid command\n";
				continue;
			}
		}	
		if(qi[xs][ys]==0||qi[xs][ys]==7){
			if(abs(xs-xt)+abs(ys-yt)!=1){
				cout<<"Invalid command\n";
				continue;
			}
			cout<<zhi[rb]<<' '<<qizi[qi[xs][ys]]<<";";
			if(qi[xt][yt]==-1)cout<<"NA;";
			else{
				if(qi[xt][yt]==0||qi[xt][yt]==7){
					die=1;
				}
				cout<<zhi[rb^1]<<' '<<qizi[qi[xt][yt]]<<";";
			}
			qi[xt][yt]=qi[xs][ys];
			qi[xs][ys]=-1;
			bool flag=0;
			if(rb==0){
				for(int j=0;j<=9;++j){
					for(int k=0;k<=8;++k){
						if(qi[j][k]==7&&check_captain(j,k,rb^1)) flag=1;
						else if(qi[j][k]==8&&check_guard(j,k,rb^1)) flag=1;
						else if(qi[j][k]==9&&check_elephant(j,k,rb^1)) flag=1;
						else if(qi[j][k]==10&&check_horse(j,k,rb^1)) flag=1;
						else if(qi[j][k]==11&&check_car(j,k,rb^1)) flag=1;
						else if(qi[j][k]==12&&check_duck(j,k,rb^1)) flag=1;
						else if(qi[j][k]==13&&check_soldier(j,k,rb^1)) flag=1;
					}
				}
			}
			else{
				for(int j=0;j<=9;++j){
					for(int k=0;k<=8;++k){
						if(qi[j][k]==0&&check_captain(j,k,rb^1)) flag=1;
						else if(qi[j][k]==1&&check_guard(j,k,rb^1)) flag=1;
						else if(qi[j][k]==2&&check_elephant(j,k,rb^1)) flag=1;
						else if(qi[j][k]==3&&check_horse(j,k,rb^1)) flag=1;
						else if(qi[j][k]==4&&check_car(j,k,rb^1)) flag=1;
						else if(qi[j][k]==5&&check_duck(j,k,rb^1)) flag=1;
						else if(qi[j][k]==6&&check_soldier(j,k,rb^1)) flag=1;
					}
				}
			}
			if(check_captain(xt,yt,rb)||flag){
				cout<<"yes;";
			}
			else cout<<"no;";
			if(die) cout<<"yes\n";
			else cout<<"no\n";
			rb^=1;
		}	
		else if(qi[xs][ys]==1||qi[xs][ys]==8){
			if(abs(xs-xt)!=1||abs(ys-yt)!=1){
				cout<<"Invalid command\n";
				continue;
			}
			cout<<zhi[rb]<<' '<<qizi[qi[xs][ys]]<<";";
			if(qi[xt][yt]==-1)cout<<"NA;";
			else{
				if(qi[xt][yt]==0||qi[xt][yt]==7){
					die=1;
				}
				cout<<zhi[rb^1]<<' '<<qizi[qi[xt][yt]]<<";";
			}
			qi[xt][yt]=qi[xs][ys];
			qi[xs][ys]=-1;
			if(check_guard(xt,yt,rb)){
				cout<<"yes;";
			}
			else cout<<"no;";
			if(die) cout<<"yes\n";
			else cout<<"no\n";
			rb^=1;
		}
		else if(qi[xs][ys]==2||qi[xs][ys]==9){
			if(abs(xs-xt)!=2||abs(ys-yt)!=2){
				cout<<"Invalid command\n";
				continue;
			}
			if(qi[(xs+xt)/2][(ys+yt)/2]!=-1){
				cout<<"Invalid command\n";
				continue;
			}
			cout<<zhi[rb]<<' '<<qizi[qi[xs][ys]]<<";";
			if(qi[xt][yt]==-1)cout<<"NA;";
			else{
				if(qi[xt][yt]==0||qi[xt][yt]==7){
					die=1;
				}
				cout<<zhi[rb^1]<<' '<<qizi[qi[xt][yt]]<<";";
			}
			qi[xt][yt]=qi[xs][ys];
			qi[xs][ys]=-1;
			if(check_elephant(xt,yt,rb)){
				cout<<"yes;";
			}
			else cout<<"no;";
			if(die) cout<<"yes\n";
			else cout<<"no\n";
			rb^=1;
		}	
		else if(qi[xs][ys]==3||qi[xs][ys]==10){
			if(!((abs(xs-xt)==2&&abs(ys-yt)==1)||(abs(xs-xt)==1&&abs(ys-yt)==2))){
				cout<<"Invalid command\n";
				continue;
			}
			if(abs(xs-xt)==1){
				if(qi[xs][(ys+yt)/2]!=-1){
					cout<<"Invalid command\n";
					continue;
				}
			}
			if(abs(ys-yt)==1){
				if(qi[(xs+xt)/2][ys]!=-1){
					cout<<"Invalid command\n";
					continue;
				}
			}
			cout<<zhi[rb]<<' '<<qizi[qi[xs][ys]]<<";";
			if(qi[xt][yt]==-1)cout<<"NA;";
			else{
				if(qi[xt][yt]==0||qi[xt][yt]==7){
					die=1;
				}
				cout<<zhi[rb^1]<<' '<<qizi[qi[xt][yt]]<<";";
			}
			qi[xt][yt]=qi[xs][ys];
			qi[xs][ys]=-1;
			if(check_horse(xt,yt,rb)){
				cout<<"yes;";
			}
			else cout<<"no;";
			if(die) cout<<"yes\n";
			else cout<<"no\n";
			rb^=1;
		}	
		else if(qi[xs][ys]==4||qi[xs][ys]==11){
			if(xs!=xt&&ys!=yt){
				cout<<"Invalid command\n";
				continue;
			}
			if(xs==xt){
				bool flag=1;
				for(int j=min(ys,yt)+1;j<max(ys,yt);++j){
					if(qi[xs][j]!=-1){
						flag=0;
						break;
					}
				}
				if(!flag){
					cout<<"Invalid command\n";
					continue;
				}
			}
			if(ys==yt){
				bool flag=1;
				for(int j=min(xs,xt)+1;j<max(xs,xt);++j){
					if(qi[j][ys]!=-1){
						flag=0;
						break;
					}
				}
				if(!flag){
					cout<<"Invalid command\n";
					continue;
				}
			}
			cout<<zhi[rb]<<' '<<qizi[qi[xs][ys]]<<";";
			if(qi[xt][yt]==-1)cout<<"NA;";
			else{
				if(qi[xt][yt]==0||qi[xt][yt]==7){
					die=1;
				}
				cout<<zhi[rb^1]<<' '<<qizi[qi[xt][yt]]<<";";
			}
			qi[xt][yt]=qi[xs][ys];
			qi[xs][ys]=-1;
			if(check_car(xt,yt,rb)){
				cout<<"yes;";
			}
			else cout<<"no;";
			if(die) cout<<"yes\n";
			else cout<<"no\n";
			rb^=1;
		}
		else if(qi[xs][ys]==5||qi[xs][ys]==12){
			if(!((abs(xs-xt)==3&&abs(ys-yt)==2)||(abs(xs-xt)==2&&abs(ys-yt)==3))){
				cout<<"Invalid command\n";
				continue;
			}
			if(xs+2==xt){
				if(ys+3==yt){
					if(qi[xs][ys+1]!=-1||qi[xs+1][ys+2]!=-1){
						cout<<"Invalid command\n";
						continue;
					}
				}
				else{
					if(qi[xs][ys-1]!=-1||qi[xs+1][ys-2]!=-1){
						cout<<"Invalid command\n";
						continue;
					}
				}
			}
			else if(xs-2==xt){
				if(ys+3==yt){
					if(qi[xs][ys+1]!=-1||qi[xs-1][ys+2]!=-1){
						cout<<"Invalid command\n";
						continue;
					}
				}
				else{
					if(qi[xs][ys-1]!=-1||qi[xs-1][ys-2]!=-1){
						cout<<"Invalid command\n";
						continue;
					}
				}
			}
			else if(xs+3==xt){
				if(ys+2==yt){
					if(qi[xs+1][ys]!=-1||qi[xs+2][ys+1]!=-1){
						cout<<"Invalid command\n";
						continue;
					}
				}
				else{
					if(qi[xs+1][ys]!=-1||qi[xs+2][ys-1]!=-1){
						cout<<"Invalid command\n";
						continue;
					}
				}
			}
			else{
				if(ys+2==yt){
					if(qi[xs-1][ys]!=-1||qi[xs-2][ys+1]!=-1){
						cout<<"Invalid command\n";
						continue;
					}
				}
				else{
					if(qi[xs-1][ys]!=-1||qi[xs-2][ys-1]!=-1){
						cout<<"Invalid command\n";
						continue;
					}
				}
			}
			cout<<zhi[rb]<<' '<<qizi[qi[xs][ys]]<<";";
			if(qi[xt][yt]==-1)cout<<"NA;";
			else{
				if(qi[xt][yt]==0||qi[xt][yt]==7){
					die=1;
				}
				cout<<zhi[rb^1]<<' '<<qizi[qi[xt][yt]]<<";";
			}
			qi[xt][yt]=qi[xs][ys];
			qi[xs][ys]=-1;
			if(check_duck(xt,yt,rb)){
				cout<<"yes;";
			}
			else cout<<"no;";
			if(die) cout<<"yes\n";
			else cout<<"no\n";
			rb^=1;
		}
		else if(qi[xs][ys]==6||qi[xs][ys]==13){
			if(!(abs(xs-xt)==1||abs(ys-yt)!=1||abs(xs-xt)==0||abs(ys-yt)==0)){
				cout<<"Invalid command\n";
				continue;
			}	
			cout<<zhi[rb]<<' '<<qizi[qi[xs][ys]]<<";";
			if(qi[xt][yt]==-1)cout<<"NA;";
			else{
				if(qi[xt][yt]==0||qi[xt][yt]==7){
					die=1;
				}
				cout<<zhi[rb^1]<<' '<<qizi[qi[xt][yt]]<<";";
			}
			qi[xt][yt]=qi[xs][ys];
			qi[xs][ys]=-1;
			if(check_soldier(xt,yt,rb)){
				cout<<"yes;";
			}
			else cout<<"no;";
			if(die) cout<<"yes\n";
			else cout<<"no\n";
			rb^=1;
		}
//		cout<<"mf: "<<i<<": \n";
//		for(int j=9;j>=0;--j){
//			for(int k=0;k<=8;++k){
//				if(qi[j][k]==-1) cout<<"          ";
//			 	else cout<<tiao[qi[j][k]];
//			}
//			cout<<'\n';
//		}
//		cout<<"\n\n\n";
	}
	return 0;
}

回复

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

正在加载回复...