算法竞赛入门经典(第2版)习题4-1 象棋UVa1589

判断红棋是否将死黑棋,看似简单,却逻辑关系还是比较多。

做题体会: 

       本人用了5个小时才把题目做完,不管有没有输入车、马、炮,都全部进行判断,判断时感觉有些笨重,算法还可以简化的。


#include <stdio.h>
#include <string.h>
#include<ctype.h>
int n, Ri, Rj, RI, RJ, Hi, Hj, HI, HJ, Ci, Cj, CI, CJ, Gi, Gj, Qi, Qj;
int change(int qi, int qj)		//判断帅、车、马、炮是否将到(qi,qj) //如果将到return 1;
{
	int ri=Ri,rj=Rj,rI=RI,rJ=RJ, hi=Hi,hj=Hj,hI=HI,hJ=HJ, ci=Ci,cj=Cj,cI=CI,cJ=CJ;

	if(qi==ri && qj==rj)
	{ri=-1;rj=-1;}
	else if(qi==rI && qj==rJ)
	{rI=-1;rJ=-1;}
	else if(qi==hi && qj==hj)
	{hi=-1;hJ=-1;}
	else if(qi==hI && qj==hJ)
	{hI=-1;hJ=-1;}
	else if(qi==ci && qj==cj)
	{ci=-1;cj=-1;}
	else if(qi==cI && qj==cJ)
	{cI=-1;cJ=-1;}


	if(rj == qj && qi > ri)
	{
		if((hj==rj && hi>ri && qi>hi) || (hJ==rj && hI>ri && qi>hI) || (cj==rj && ci>ri && qi>ci) || (cJ==rj && cI>ri && qi>cI))
		{}
		else
			return 1;
	}
	else if(rj == qj && qi < ri)
	{
		if((hj==rj && hi<ri && qi<hi) || (hJ==rj && hI<ri && qi<hI) || (cj==rj && ci<ri && qi<ci) || (cJ==rj && cI<ri && qi<cI))
		{}
		else
			return 1;
	}
	else if(ri == qi && qj > rj)
	{
		if((hi==ri && hj>rj && qj>hj) || (hI==ri && hJ>rj && qj>hJ) || (ci==ri && cj>rj && qj>cj) || (cI==ri && cJ>rj && qj>cJ))
		{}
		else return 1;
	}
	else if(ri == qi && qj < rj)
	{
		if((hi==ri && hj<rj && qj<hj) || (hI==ri && hJ<rj && qj<hJ) || (ci==ri && cj<rj && qj<cj) || (cI==ri && cJ<rj && qj<cJ))
		{}
		else return 1;
	}//第1个车的判断


	if(rJ == qj && qi > rI)
	{
		if((hj==rJ && hi>rI && qi>hi) || (hJ==rJ && hI>rI && qi>hI) || (cj==rJ && ci>rI && qi>ci) || (cJ==rJ && cI>rI && qi>cI))
		{}
		else
			return 1;
	}
	else if(rJ == qj && qi < rI)
	{
		if((hj==rJ && hi<rI && qi<hi) || (hJ==rJ && hI<rI && qi<hI) || (cj==rJ && ci<rI && qi<ci) || (cJ==rJ && cI<rI && qi<cI))
		{}
		else
			return 1;
	}
	else if(rI == qi && qj > rJ)
	{
		if((hi==rI && hj>rJ && qj>hj) || (hI==rI && hJ>rJ && qj>hJ) || (ci==rI && cj>rJ && qj>cj) || (cI==rI && cJ>rJ && qj>cJ))
		{}
		else return 1;
	}
	else if(rI == qi && qj < rJ)
	{
		if((hi==rI && hj<rJ && qj<hj) || (hI==rI && hJ<rJ && qj<hJ) || (ci==rI && cj<rJ && qj<cj) || (cI==rI && cJ<rJ && qj<cJ))
		{}
		else return 1;
	}//第2个车的判断

	if(cj == qj && qi < ci)
	{
		int n=0;
		if(rj == cj && ri<ci && qi<ri)
			n++;
		if(rJ == cj && rI<ci && qi<rI)
			n++;
		if(hj == cj && hi<ci && qi<hi)
			n++;
		if(hJ == cj && hI<ci && qi<hI)
			n++;
		if(cJ == cj && cI<ci && qi<cI)
			n++;
		if(Gj == cj && Gi<ci)
			n++;
		if(n == 1)
			return 1;
	}
	else if(cj == qj && ci < qi)
	{
		int n=0;
		if(hj == cj && hi>ci && qi>hi)
			n++;
		if(hJ == cj && hI>ci && qi>hI)
			n++;
		if(cJ == cj && cI>ci && qi>cI)
			n++;
		if(n == 1)
			return 1;
	}
	else if(ci == qi && cj < qj)
	{
		int n=0;
		if(ri == ci && rj>cj && qj>rj)
			n++;
		if(rI == ci && rJ>cj && qj>rJ)
			n++;
		if(hi == ci && hj>cj && qj>hj)
			n++;
		if(hI == ci && hJ>cj && qj>hJ)
			n++;
		if(cI == ci && cJ>cj && qj>cJ)
			n++;
		if(n == 1)
			return 1;
	}
	else if(ci == qi && cj > qj)
	{
		int n=0;
		if(ri == ci && rj<cj && qj<rj)
			n++;
		if(rI == ci && rJ<cj && qj<rJ)
			n++;
		if(hi == ci && hj<cj && qj<hj)
			n++;
		if(hI == ci && hJ<cj && qj<hJ)
			n++;
		if(cI == ci && cJ<cj && qj<cJ)
			n++;
		if(n == 1)
			return 1;
	}//第1个炮判断


	if(cJ == qj && qi < cI)
	{
		int n=0;
		if(rj == cJ && ri<cI && qi<ri)
			n++;
		if(rJ == cJ && rI<cI && qi<rI)
			n++;
		if(hj == cJ && hi<cI && qi<hi)
			n++;
		if(hJ == cJ && hI<cI && qi<hI)
			n++;
		if(cj == cJ && ci<cI && qi<cI)
			n++;
		if(Gj == cJ && Gi<cI)
			n++;
		if(n == 1)
			return 1;
	}
	else if(cJ == qj && cI < qi)
	{
		int n=0;
		if(hj == cJ && hi>cI && qi>hi)
			n++;
		if(hJ == cJ && hI>cI && qi>hI)
			n++;
		if(cj == cJ && ci>cI && qi>ci)
			n++;
		if(n == 1)
			return 1;
	}
	else if(cI == qi && cJ < qj)
	{
		int n=0;
		if(ri == cI && rj>cJ && qj>rj)
			n++;
		if(rI == cI && rJ>cJ && qj>rJ)
			n++;
		if(hi == cI && hj>cJ && qj>hj)
			n++;
		if(hI == cI && hJ>cJ && qj>hJ)
			n++;
		if(ci == cI && cj>cJ && qj>cj)
			n++;
		if(n == 1)
			return 1;
	}
	else if(cI == qi && cJ > qj)
	{
		int n=0;
		if(ri == cI && rj<cJ && qj<rj)
			n++;
		if(rI == cI && rJ<cJ && qj<rJ)
			n++;
		if(hi == cI && hj<cJ && qj<hj)
			n++;
		if(hI == cI && hJ<cJ && qj<hJ)
			n++;
		if(ci == cI && cj<cJ && qj<cj)
			n++;
		if(n == 1)
			return 1;
	}//第2个炮判断


	if(Gj == qj)
	{
		if((hj == qj && hi<Gi && qi<hi) || (hJ == qj && hI<Gi && qi<hI) || (cj == qj && ci<Gi && qi<ci) || (cJ == qj && cI<Gi && qi<cI))
		{}
		else
			return 1;
	}//判断帅


	if(((hi == qi-1) && (hj == qj+2)) || ((hi == qi-2) && (hj == qj+1)))
	{
		if((ri != qi-1 && rj != qj+1) && (rI != qi-1 && rJ != qj+1) && (hI != qi-1 && hJ != qj+1) && (ci != qi-1 && cj != qj+1) && (cI != qi-1 && cJ != qj+1))
			return 1;
	}
	else if((hi == qi-1 && hj == qj-2) || (hi == qi-2 && hj == qj-1))
	{
		if((ri != qi-1 && rj != qj-1) && (rI != qi-1 && rJ != qj-1) && (hI != qi-1 && hJ != qj-1) && (ci != qi-1 && cj != qj-1) && (cI != qi-1 && cJ != qj-1))
			return 1;
	}
	else if((hi == qi+1 && hj == qj-2) || (hi == qi+2 && hj == qj-1))
	{
		if((ri != qi+1 && rj != qj-1) && (rI != qi+1 && rJ != qj-1) && (hI != qi+1 && hJ != qj-1) && (ci != qi+1 && cj != qj-1) && (cI != qi+1 && cJ != qj-1))
			return 1;
	}
	else if((hi == qi+1 && hj == qj+2) || (hi == qi+2 && hj == qj+1))
	{
		if((ri != qi+1 && rj != qj+1) && (rI != qi+1 && rJ != qj+1) && (hI != qi+1 && hJ != qj+1) && (ci != qi+1 && cj != qj+1) && (cI != qi+1 && cJ != qj+1))
			return 1;
	}//第1个马判断

	if(((hI == qi-1) && (hJ == qj+2)) || ((hI == qi-2) && (hJ == qj+1)))
	{
		if((ri != qi-1 && rj != qj+1) && (rI != qi-1 && rJ != qj+1) && (hi != qi-1 && hj != qj+1) && (ci != qi-1 && cj != qj+1) && (cI != qi-1 && cJ != qj+1))
			return 1;
	}
	else if((hI == qi-1 && hJ == qj-2) || (hI == qi-2 && hJ == qj-1))
	{
		if((ri != qi-1 && rj != qj-1) && (rI != qi-1 && rJ != qj-1) && (hi != qi-1 && hj != qj-1) && (ci != qi-1 && cj != qj-1) && (cI != qi-1 && cJ != qj-1))
			return 1;
	}
	else if((hI == qi+1 && hJ == qj-2) || (hI == qi+2 && hJ == qj-1))
	{
		if((ri != qi+1 && rj != qj-1) && (rI != qi+1 && rJ != qj-1) && (hi != qi+1 && hj != qj-1) && (ci != qi+1 && cj != qj-1) && (cI != qi+1 && cJ != qj-1))
			return 1;
	}
	else if((hI == qi+1 && hJ == qj+2) || (hI == qi+2 && hJ == qj+1))
	{
		if((ri != qi+1 && rj != qj+1) && (rI != qi+1 && rJ != qj+1) && (hi != qi+1 && hj != qj+1) && (ci != qi+1 && cj != qj+1) && (cI != qi+1 && cJ != qj+1))
			return 1;
	}//第2个马判断
	return 0;
}
int main()
{
	for(;;)
	{
		int k = 0, g = 0, r = 0, h = 0, c = 0, q = 0;
		Ri=-1, Rj=-1, RI=-1, RJ=-1, Hi=-1, Hj=-1, HI=-1, HJ=-1, Ci=-1, Cj=-1, CI=-1, CJ=-1, Gi=-1, Gj=-1, Qi=-1, Qj=-1;
		scanf("%d%d%d", &n, &Qi, &Qj);
		if(n == 0)
			break;
		while(n--)
		{
			char t;
			int i, j;
			t = getchar();
			while(!isalpha(t)) t = getchar();   //如果没了这句,就会把回车赋值给t
			scanf("%d%d", &i, &j);
			if(t == 'R')
			{
				r++;
				if(r == 1)
				{Ri=i;Rj=j;}
				if(r==2)
				{RI=i;RJ=j;}
			}
			else if(t == 'H')
			{
				h++;
				if(h==1)
				{Hi=i;Hj=j;}
				if(h==2)
				{HI=i;HJ=j;}
			}
			else if(t == 'C')
			{
				c++;
				if(c==1)
				{Ci=i;Cj=j;}
				if(c==2)
				{CI=i;CJ=j;}
			}
			else if(t == 'G')
			{
				g++;
				Gi = i;
				Gj = j;
			}
		}
		//printf("Qi=%d Qj=%d Gi=%d Gj=%d Ci=%d Cj=%d Ri=%d Rj=%d\nHi=%d Hj=%d CI=%d CJ=%d RI=%d RJ=%d\n", Qi, Qj, Gi, Gj, Ci, Cj, Ri, Rj, Hi, Hj, CI, CJ, RI, RJ);
		if(g != 1 || r>2 || h>2 || c>2)
			return 0;
		if(Qi >= 1 && Qi <= 3 && Qj >= 4 && Qj <=6)
		{
			int a=1, b=1, c=1, d=1;
			if(Qi-1 >= 1)
				a = change(Qi-1, Qj);
			if(Qi+1 <= 3)
				b = change(Qi+1, Qj);
			if(Qj-1 >= 4)
				c = change(Qi, Qj-1);
			if(Qj+1 <= 6)
				d = change(Qi, Qj+1);
			if(a && b && c && d)
				printf("YES\n");
			else printf("NO\n");
		}
	}
	return 0;
}



                
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值