zoukankan      html  css  js  c++  java
  • [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
    */
    
  • 相关阅读:
    Javaweb开发环境与搭建
    剑指Offer:面试题32——从1到n整数中1出现的次数(java实现)
    剑指Offer:面试题31——连续子数组的最大和(java实现)
    剑指Offer:面试题30——最小的k个数(java实现)
    剑指Offer:面试题29——数组中出现次数超过一半的数字(java实现)
    剑指Offer:解决难题时的三大方法
    剑指Offer:面试题28——字符串的排列(java实现)(待序)
    剑指Offer:面试题27——二叉搜索树与双向链表(java实现)
    剑指Offer:面试题26——复制复杂的链表(java实现)
    剑指Offer:面试题25——二叉树中和为某一值的路径(java实现)
  • 原文地址:https://www.cnblogs.com/org0/p/13896114.html
Copyright © 2011-2022 走看看