[THUPC2019]鸭棋
7587587587ggggggggggggggggggggggggg
#include <bits/stdc++.h>
using namespace std;
struct ccf{
int x,y;
bool flag;//有没有被吃,0为否,1为是
}king[2]; //王目前的位置,0是红,1是蓝
int m[13][13],dx[4][9]={{0},{0,0,1,-1},{1,1,-1,-1},{0,0,1,-1,1,1,-1,-1}},dy[4][9]={{0},{1,-1,0,0},{1,-1,1,-1},{1,-1,0,0,1,-1,1,-1}};
int dx4[4]={1,1,-1,-1},dy4[4]={1,-1,1,-1},z[2][9]={{0,-1,-2,-3,-4,-5,-6,-7},{0,1,2,3,4,5,6,7}};
char kind[9][20]={{ },{"captain"},{"guard"},{"elephant"},{"horse"},{"car"},{"duck"},{"soldier"}};
inline int abss(int x)
{
return x<0?-x:x;
}
bool check(int a,int b,int c,int d,int e)
{
int n=3;
if(e==7)
{
e=3;
n=7;
}
for(int i=0;i<=n;++i)
{
int x=a+dx[e][i],y=b+dy[e][i];
if(x==c&&y==d)
return true;
}
return false;
}
bool check3(int a,int b,int c,int d)
{
if(abss(a-c)!=2||abss(b-d)!=2) return false;
int x,y;
if(c>a) x=a+1;
else x=a-1;
if(d>b) y=b+1;
else y=b-1;
if(m[x][y]==0) return true;
return false;
}
bool check4(int a,int b,int c,int d)
{
for(int i=1;i<=2;++i)
{
int xi=i,yi=3-i;
for(int j=0;j<=3;++j)
{
int x=a+xi*dx4[j],y=b+yi*dy4[j];
if(c==x&&d==y)
{
if(m[a+(xi-1)*dx4[j]][b+(yi-1)*dy4[j]]==0)
return true;
else
return false;
}
}
}
return false;
}
bool check5(int a,int b,int c,int d)
{
if(a!=c&&b!=d) return false;
for(int i=min(a,c)+1;i<=max(a,c)-1;++i)
if(m[i][b]!=0) return false;
for(int i=min(b,d)+1;i<=max(b,d)-1;++i)
if(m[a][i]!=0) return false;
return true;
}
bool check6(int a,int b,int c,int d)
{
for(int i=2;i<=3;++i)
{
int xi=i,yi=5-i;
for(int j=0;j<=3;++j)
{
int x=a+xi*dx4[j],y=b+yi*dy4[j];
if(c==x&&d==y)
{
if((m[a+(xi-1)*dx4[j]][b+(yi-1)*dy4[j]]==0)&&(m[a+(xi-2)*dx4[j]][b+(yi-2)*dy4[j]]==0))
return true;
else
return false;
}
}
}
return false;
}
bool CheckOrder(int a,int b,int c,int d)
{
if(m[a][b]==0) return false;//初始位置没有棋子
if(m[a][b]*m[c][d]>0) return false;// 初始位置和结束位置是同一方
int e=abss(m[a][b]);
switch(e) //结束位置要么没有棋子,要么是敌方棋子
{
case 1:return check(a,b,c,d,e);
case 2:return check(a,b,c,d,e);
case 3:return check3(a,b,c,d);
case 4:return check4(a,b,c,d);
case 5:return check5(a,b,c,d);
case 6:return check6(a,b,c,d);
case 7:return check(a,b,c,d,e);
}
return false;
}
bool CheckKing(int k)
{
int a=king[k].x,b=king[k].y;
for(int i=0;i<=7;++i)
{
int x=a+dx[3][i],y=b+dy[3][i];
if(m[x][y]==z[k][7]) return true;
if(i<=3&&m[x][y]==z[k][1]) return true;
if(i>3&&m[x][y]==z[k][2]) return true;
}
for(int i=0;i<=3;++i)
{
if(m[a+dx4[i]*2][b+dy4[i]*2]==z[k][3]&&m[a+dx4[i]][b+dy4[i]]==0)
return true;
for(int j=1;j<=2;++j)
{
int xi=j,yi=3-j;
if(m[a+dx4[i]*xi][b+dy4[i]*yi]==z[k][4]&&check4(a+dx4[i]*xi,b+dy4[i]*yi,a,b))//m[a+dx4[i]*(xi-1)][b+dy4[i]*(yi-1)]==0
return true;
}
for(int j=2;j<=3;++j)
{
int xi=j,yi=5-j;
//cout<<"-------------------------"<<a<<" "<<b<<" "<<dx4[i]<<" "<<dy4[i]<<" "<<xi<<" "<<yi<<endl;
if(m[a+dx4[i]*xi][b+dy4[i]*yi]==z[k][6]&&check6(a+dx4[i]*xi,b+dy4[i]*yi,a,b))/*m[a+dx4[i]*(xi-1)][b+dy4[i]*(yi-1)]==0&&m[a+dx4[i]*(xi-2)][b+dy4[i]*(yi-2)]==0*/
return true;
}
}
for(int i=a+1;i<=9;++i)
{
if(m[i][b]==z[k][5]) return true;
if(m[i][b]!=0) break;
}
for(int i=a-1;i>=0;--i)
{
if(m[i][b]==z[k][5]) return true;
if(m[i][b]!=0) break;
}
for(int i=b+1;i<=8;++i)
{
if(m[a][i]==z[k][5]) return true;
if(m[a][i]!=0) break;
}
for(int i=b-1;i>=0;--i)
{
if(m[a][i]==z[k][5]) return true;
if(m[a][i]!=0) break;
}
return false;
}
int main()
{
//freopen("2.in","r",stdin);
//freopen("1.out","w",stdout);
memset(m,0,sizeof(m));
memset(king,0,sizeof(king));
for(int i=0;i<=4;++i)
{
m[0][i]=5-i;
m[9][i]=-5+i;
}
for(int i=5;i<=8;++i)
{
m[0][i]=i-3;
m[9][i]=-i+3;
}
for(int i=0;i<=8;i+=2)
{
m[3][i]=7;
m[6][i]=-7;
}
m[2][0]=m[2][8]=6;
m[7][0]=m[7][8]=-6;
king[0].x=0;king[0].y=4;//red
king[1].x=9;king[1].y=4;//blue
int n,now=1;//1是红方,-1是蓝方
cin>>n;
for(int i=1;i<=n;++i)
{
bool flag=false;//判断有没有将军
int a,b,c,d;
scanf("%d%d%d%d",&a,&b,&c,&d);
if((king[0].flag||king[1].flag)||(now*m[a][b]<0)||(!CheckOrder(a,b,c,d)))
{
printf("Invalid command\n");
continue;
}
if(now==1) printf("red ");
else printf("blue ");
printf("%s;",kind[abss(m[a][b])]);
if(m[c][d]==0) printf("NA;");
else{
if(now==1) printf("blue ");
else printf("red ");
printf("%s;",kind[abss(m[c][d])]);
if(m[c][d]==1) king[0].flag=true;
if(m[c][d]==-1) king[1].flag=true;
}
if(m[a][b]==1)
{
king[0].x=c;
king[0].y=d;
}
if(m[a][b]==-1)
{
king[1].x=c;
king[1].y=d;
}
m[c][d]=m[a][b];
m[a][b]=0;
//cout<<king[0].x<<" "<<king[0].y<<" "<<king[0].flag<<endl;
//cout<<king[1].x<<" "<<king[1].y<<" "<<king[1].flag<<endl;
if(!king[0].flag)
flag=CheckKing(0);
if(!flag&&!king[1].flag)
flag=CheckKing(1);
if(flag) printf("yes;");
else printf("no;");
if(king[0].flag||king[1].flag) printf("yes\n");
else printf("no\n");
if(now==1) now=-1;
else now=1;
/*for(int i=9;i>=0;--i)
{
for(int j=0;j<=8;++j)
printf("%-4d ",m[i][j]);
cout<<endl;
}
cout<<"***************************************************"<<endl;*/
}
}
/*
-7:蓝兵 soldier
-6:蓝鸭 duck
-5:蓝车 car
-4:蓝马 horse
-3:蓝象 elephant
-2:蓝士 guard
-1:蓝王 captain
0:无棋子
1:红王 captain
2:红士 guard
3:红象 elephant
4:红马 horse
5:红车 car
6:红鸭 duck
7:红兵 soldier
*/