我用的曼哈顿距离判的不合法,样例过了。 不知道是为什么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;
}