判断红棋是否将死黑棋,看似简单,却逻辑关系还是比较多。
做题体会:
本人用了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;
}