[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
*/
posted @ 2020-10-29 12:41  停不下来的奥尔加  阅读(68)  评论(0编辑  收藏  举报