uva1589 象棋 算法竞赛入门经典刘汝佳 习题4-1 C++ AC代码

搞了一下午。不过AC后成就感也是很大的。感谢黑魂给我带来的耐心。
还有很多代码可以化简一下。

题目地址:
https://onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4464

样例测试:
https://www.udebug.com/UVa/1589

#include<iostream>
#include <string.h>
#include<cmath>
using namespace std;
int aa[15][15];
int t[4] = {1,0,-1,0};
int u[4] = {0,1,0,-1};

struct qizi
{
	int x;
	int y;
	char c;
}qz[10];

int ju(int n,int bx,int by);
int main()
{
	int n = 0;
	int bx = 0;
	int by = 0;
	while(cin>>n>>bx>>by && n!=0 && bx!=0 && by!=0)
	 {
	 	for(int i = 0;i<15;++i)
	 	  {
	 	  	memset(aa[i],0,sizeof(aa[i]));
		  }
		  aa[bx][by] = 1;
		  
	 	for(int i = 0;i<n;++i)
	 	{
	 		cin>>qz[i].c>>qz[i].x>>qz[i].y;
	 		aa[qz[i].x][qz[i].y] = 1;
		}
		int kp = 0;
		for(int i = 0;i<n;++i)
		{
			kp = 0;
			if(qz[i].c == 'G')
			{
			  if(qz[i].y == by)
			  {
			  	kp = 1;
				for(int j = 0;j<n;++j)
				{
					  if((j!=i) && (qz[j].y == qz[i].y) && (qz[j].x>bx) && (qz[i].x>qz[j].x))
				      { 
				       kp = 0; 
					   break;
					  } 	
				}		
			  }
			}
			if(kp)
			  break;
	 }
	  	if(kp)
	   {
		  cout<<"NO"<<endl;
		  continue;
		 }
	 aa[bx][by] = 0;
	 int jj = 1;
	  for(int l = 0;l<4;++l)
	  {
	  	//吃子 
	  	if(bx+t[l]<4 && bx+t[l]>0 && by+u[l]<7 && by+u[l]>3)
	  {
		  
	  	aa[bx+t[l]][by+u[l]] = 1;
	  	int kl = 0;
	  	int kj = 14;
	  	char cc;

	  	for(int i = 0;i<n;++i)
	  	   {
			 if(bx+t[l] == qz[i].x && by+u[l] == qz[i].y)
		      {
		      	kl = 1;
		      	cc = qz[i].c;
		      	kj = i;
		      	qz[i].c = 'B';
            	break;
		      }
		      }
		      
		    if(!ju(n,bx+t[l],by+u[l]))
		      jj = 0;
		 
		 
		 if(kl == 0)
		   aa[bx+t[l]][by+u[l]] = 0;
		 else
		   qz[kj].c = cc;
		    
	   }
	   }
	   if(jj == 0)
        {
		cout<<"NO"<<endl;
	}
       else
        {
		 cout<<"YES"<<endl;
	}
	 
}
}

int ju(int n,int bx,int by)
{
	int kx = 14;
	int ky = 14;
for(int i = 0;i<n;++i)
		{ 

			int k = 0;
			if(qz[i].c == 'G')
			{
			  if(qz[i].y == by)
			  {
			  	k = 1;
				for(int j = 0;j<n;++j)
				{
					  if(j!=i && qz[j].c!='B' && qz[j].y == qz[i].y && qz[j].x>bx && qz[i].x>qz[j].x)
				      { 
				       k = 0; 
					   break;
					  } 	
				}		
			  }
				if(k)
                  {
                  	//cout<<"G";
                  	return 1;
				  }
			}
			if(qz[i].c == 'R')
			{
			if(qz[i].y == by)
			  {
			  	k = 1;
				for(int j = 0;j<n;++j)
				{
					  if(j!=i && qz[j].c!='B' && qz[j].y == qz[i].y && abs(qz[j].x-bx)<abs(qz[i].x-bx) && (qz[j].x-bx)*(qz[i].x-bx)>0 )
				      { 
				       k = 0; 
					   break;
					  } 	
				}		
			  }
			  if(qz[i].x == bx)
			  {
			  	k = 1;
				for(int j = 0;j<n;++j)
				{
					  if(j!=i && qz[j].c!='B' && qz[j].x == qz[i].x && abs(qz[j].y-by)<abs(qz[i].y-by) && (qz[j].y-by)*(qz[i].y-by)>0)
				      { 
				       k = 0; 
					   break;
					  } 	
				}		
			  }
				if(k)
				 {
				 	//cout<<"R";
				    return 1;
				 }
			}
			if(qz[i].c == 'C')
			{
				if(qz[i].y == by)
			  {
			  	k = 0;
				for(int j = 0;j<n;++j)
				{
					  if(j!=i && qz[j].c!='B' && qz[j].y == qz[i].y && abs(qz[j].x-bx)<abs(qz[i].x-bx) && (qz[j].x-bx)*(qz[i].x-bx)>0)
				      { 
				       ++k; 
					  } 	
				}		
			  }
			  if(qz[i].x == bx)
			  {
			  	k = 0;
				for(int j = 0;j<n;++j)
				{
					  if(j!=i && qz[j].c!='B' && qz[j].x == qz[i].x && abs(qz[j].y-by)<abs(qz[i].y-by) && (qz[j].y-by)*(qz[i].y-by)>0)
				      { 
				       ++k; 
					  } 	
				}		
			  }
				if(k == 1)
				{
					//cout<<"C";
				 return 1;
				}
				
			}
			if(qz[i].c == 'H')
			{
				for(int j = 0;j<4;++j)
				{
					if(aa[qz[i].x+t[j]][qz[i].y+u[j]] == 1)
					 continue;
					else
					{
						switch(j)
						{
							case 0:
								if(qz[i].x+2 == bx && (qz[i].y+1 == by || qz[i].y-1 == by))
								{
									//cout<<"R";
				                     return 1; 
								}
								break;
							case 1:
								if(qz[i].y+2 == by && (qz[i].x+1 == bx || qz[i].x-1 == bx))
								{
									//cout<<"R";
				                     return 1; 
								}
								break;
		
							case 2:
								if(qz[i].x-2 == bx && (qz[i].y+1 == by || qz[i].y-1 == by))
								 {
									//cout<<"R";
				                     return 1; 
								}
								break;
							case 3:
								if(qz[i].y-2 == by && (qz[i].x+1 == bx || qz[i].x-1 == bx))
								{
									//cout<<"R";
				                     return 1; 
								}	
								break;
						}
						
					}
				}
			}	
	  }
		return 0; 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值