球调
查看原帖
球调
448897
Ctrl加C楼主2023/8/28 20:32

我用的曼哈顿距离判的不合法,样例过了。 不知道是为什么QAQ; 我太弱了。

#include<bits/stdc++.h>

using namespace std;

inline int read(){
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-')f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		x=x*10+ch-'0';
		ch=getchar();
	}
	return x*f;
}

int a[15][15]={{1,2,3,4,5,4,3,2,1},{0},{6,0,0,0,0,0,0,0,6},{7,0,7,0,7,0,7,0,7},
{0},{0},{23,0,23,0,23,0,23,0,23},{22,0,0,0,0,0,0,0,22},{0},{17,18,19,20,21,20,19,18,17}
};

int dx[9]={0,-1,-1,-1,0,1,1,1};
int dy[9]={-1,-1,0,1,1,1,0,-1};

int get_dis(int x,int y,int edx,int edy){
	return abs(x-edx)+abs(y-edy);
}

bool check1(int x,int y,int edx,int edy,bool col){
	if(edx==x&&edy==y){
//		cout<<"重复"<<endl;
		return false;
	}
	if(edx<0||edx>9||edy<0||edy>8||x<0||x>9||y<0||y>8){
//		cout<<"越界"<<endl; 
		return false;//越界 
	}
	if(a[x][y]==0){
//		cout<<"没棋子"<<endl;
		return false;//没棋子 
	}
	
	if(col==0&&a[x][y]>=17){
//		cout<<"移动了对方的棋子"<<endl;
		return false;
	}
	if(col==1&&a[x][y]<=7){
//		cout<<"移动了对方的棋子"<<endl;
		return false;//不是己方棋子 
	}
	if(col==0&&a[edx][edy]<=7&&a[edx][edy]>=1){
//		cout<<"终点是己方棋子"<<endl;
		return false;
	}
	if(col==1&&a[edx][edy]>=17){
//		cout<<"终点是己方棋子"<<endl;
		return false;//终点有己方棋子 
	}
	int op=a[x][y];
	if(op==1||op==17){
		if(x!=edx&&y!=edy){
//			cout<<"车没有移动到同行同列"<<endl;
			return false;//车
		}
		if(x==edx){
			int py=y,pyy=edy;
			if(py>pyy)swap(py,pyy);
			for(int i=py+1;i<pyy;++i){
				if(a[x][i]){
//					cout<<"路径上有子"<<endl;
					return false;
				}
			}
		}
		else{
			int px=x,pxx=edx;
			if(px>pxx)swap(px,pxx);
			for(int i=px+1;i<pxx;i++){
				if(a[i][y]){
//					cout<<"路径上有子"<<endl;
					return false;
				}
			}
		}
	}
	if(op==2||op==18){//马 
		if((abs(x-edx)!=2||abs(y-edy)!=1)&&(abs(x-edx)!=1||abs(y-edy)!=2)){
//			cout<<"不是日字"<<endl;
			return false;//是否是日字 
		}
		int px=0,py=0;
		for(int i=0;i<8;++i){
			if(get_dis(x,y,x+dx[i],y+dy[i])==1&&get_dis(edx,edy,x+dx[i],y+dy[i])==2){
				px=x+dx[i],py=y+dy[i];
				break;
			}
		}//蹩马腿
		if(a[px][py]){
//			cout<<"蹩马腿"<<endl;
			return false;	
		}
	}
	if(op==3||op==19){//象 
		if(abs(x-edx)!=2||abs(y-edy)!=2){
//			cout<<"不是田字"<<endl; 
			return false;//是否是田字
		}
		int px=0,py=0;
		for(int i=0;i<8;++i){
			if(get_dis(x,y,x+dx[i],y+dy[i])==2&&get_dis(edx,edy,x+dx[i],y+dy[i])==2){
				px=x+dx[i],py=y+dy[i];
				break;
			}
		}
		if(a[px][py]){
//			cout<<px<<" "<<py<<endl;
//			cout<<"穿象眼"<<endl;
			return false;//穿象眼 
		}
	}
	if(op==4||op==20)if(get_dis(x,y,edx,edy)!=2){
//		cout<<"士移动不合法"<<endl;
		return false;//士
	}
	if(op==5||op==21)if(get_dis(x,y,edx,edy)>1){
//		cout<<"王移动不合法"<<endl;
		return false;//王
	}
	if(op==6||op==22){//鸭 
		if((abs(x-edx)!=2||abs(y-edy)!=3)&&(abs(x-edx)!=3||abs(y-edy)!=2)){
//			cout<<"不是大日"<<endl;
			return false;//是否是大日
		}
		int yx=0,yy=0,tx=0,ty=0;//鸭眼,鸭腿
		for(int i=0;i<8;++i){
//			if(get_dis(x,y,x+dx[i],y+dy[i])==1&&get_dis(edx,edy,x+dx[i],y+dy[i])==3)yx=x+dx[i],yy=y+dy[i];
			if(abs(x+dx[i]-edx)==2&&abs(y+dy[i]-edy)==2)yx=x+dx[i],yy=y+dy[i];
			if(x+dx[i]==x||y+dy[i]==y||edx+dx[i]==edx||edy+dy[i]==edy)continue;
			if(get_dis(x,y,edx+dx[i],edy+dy[i])==3&&get_dis(edx,edy,edx+dx[i],edy+dy[i])==2)tx=edx+dx[i],ty=edy+dy[i];
		}
		if(a[yx][yy]||a[tx][ty]){
//			cout<<"鸭被憋了"<<endl;
			return false;
		}
	}
	if(op==7||op==23){//兵 
		if(edx==x||edy==y){
			if(get_dis(x,y,edx,edy)!=1){
//				cout<<"兵移动不合法"<<endl;
				return false;
			}
		}
		else{
			if(get_dis(x,y,edx,edy)!=2){
//				cout<<"兵移动不合法"<<endl;
				return false;
			}
		}
	}
	return true;
}

void get_op(int x,int y){
	if(a[x][y]==1||a[x][y]==17)printf("car");
	if(a[x][y]==2||a[x][y]==18)printf("horse");
	if(a[x][y]==3||a[x][y]==19)printf("elephant");
	if(a[x][y]==4||a[x][y]==20)printf("guard");
	if(a[x][y]==5||a[x][y]==21)printf("captain");
	if(a[x][y]==6||a[x][y]==22)printf("duck");
	if(a[x][y]==7||a[x][y]==23)printf("soldier");
}

int main(){
	int q=read();
	int color=0;
	int vis=0;
	for(int i=1;i<=q;++i){
//		for(int j=9;j>=0;--j){
//			for(int k=0;k<9;++k)printf("%3d",a[j][k]);
//			cout<<endl;
//		}
		int x=read(),y=read(),edx=read(),edy=read();
//		cout<<a[x][y]<<" "<<a[edx][edy]<<"()()()()"<<endl;
		if(vis==1){
			printf("Invalid command\n");
			continue;
		}
		if(!check1(x,y,edx,edy,color)){
			printf("Invalid command\n");
			continue;
		}
		if(color==0)printf("red ");
		else printf("blue ");
		get_op(x,y);
		printf(";");
		if(a[edx][edy]){
			if(color==0)printf("blue ");
			else printf("red ");
			get_op(edx,edy);
			printf(";");
		}
		else printf("NA;");
		a[edx][edy]=a[x][y];
		a[x][y]=0;
		int wxr=0,wyr=0,wxb=0,wyb=0,cnt=0;
		for(int i=0;i<10;++i){
			for(int j=0;j<9;++j){
				if(a[i][j]==5)wxr=i,wyr=j,cnt++;//红方王 
				if(a[i][j]==21)wxb=i,wyb=j,cnt++;//蓝方王 
			}
		}
//		cout<<wxr<<" "<<wyr<<" "<<wxb<<" "<<wyb<<" "<<cnt<<endl;
		for(int i=0;i<10;++i){
			for(int j=0;j<9;++j){
				if(a[i][j]>=1&&a[i][j]<=7){
					if(check1(i,j,wxb,wyb,0)==1){
						printf("yes;");
						goto aa;
					}
				}
				if(a[i][j]>=17){
					if(check1(i,j,wxr,wyr,1)==1){
						printf("yes;");
						goto aa;
					}
				}
			}
		}
		printf("no;");
		aa:;
		if(cnt!=2){
			printf("yes\n");
			vis=1;
		}
		else printf("no\n");
		color^=1;                                                                                    
	}
	return 0;
}
2023/8/28 20:32
加载中...