//
原来blog上的代码,第一次做的时候很麻烦,枚举的,但是wrong了,但是枚举完就很明白这个题了。这个题算是我UVA上用时排名最靠前的一个题了,第四,酸爽。。。
//
模拟:
模拟主要是题意难懂, 题意不懂根本就没发做, 这个题神坑就是将对帅直接no,无语。
如果题意懂了 模拟应该就是很基本的东西了 先写架构 再写 不然最后就很乱了
//
这个题的思路:
一个子最多有四个位置可走, 红方封死四个位置, 胜
感觉这个代码赛场写成这样就是傻, 不过自己看感觉还行
//
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#define MAX_SIZE 11
typedef struct
{
char ch;
int x;
}Chessman;
int Calculate(Chessman Chess[][MAX_SIZE],int black_x,int black_y,int red_y);
int Calculate_General(Chessman Chess[][MAX_SIZE],int black_x,int black_y,int red_y);
int Calculate_Chariot(Chessman Chess[][MAX_SIZE],int black_x,int black_y,int red_y);
int Calculate_Cannon(Chessman Chess[][MAX_SIZE],int black_x,int black_y,int red_y);
int Calculate_Horse(Chessman Chess[][MAX_SIZE],int black_x,int black_y,int red_y);
int main()
{
Chessman Chess[MAX_SIZE][MAX_SIZE];
int black_x,black_y,red_x,red_y,result,result1,result2,result3,result4;
int N,i,x,y;
char ch[10];
while(1)
{
for(x=1;x<=10;x++)for(y=1;y<=10;y++){Chess[x][y].x=0;Chess[x][y].ch='\0';}
memset(ch,0,sizeof(ch));
scanf("%d %d %d",&N,&black_x,&black_y);if(N==0&&black_x==0&&black_y==0)return 0;
Chess[black_x][black_y].x=2;
for(i=1;i<=N;i++)
{
scanf("%s%d%d",ch,&x,&y);getchar();
if(ch[0]=='G'){Chess[x][y].x=1;Chess[x][y].ch='G';red_x = x;red_y = y;}
else {Chess[x][y].x=1;Chess[x][y].ch=ch[0];}
}
result = Calculate_General(Chess,black_x,black_y,red_y);
if(result==1){printf("NO\n");continue;}
if(black_x+1>3)result1=1;
else result1 = Calculate(Chess,black_x+1,black_y,red_y);
if(black_x-1<1)result2=1;
else result2 = Calculate(Chess,black_x-1,black_y,red_y);
if(black_y-1<4)result3=1;
else result3 = Calculate(Chess,black_x,black_y-1,red_y);
if(black_y+1>6)result4=1;
else result4 = Calculate(Chess,black_x,black_y+1,red_y);
int sum=result1+result2+result3+result4;
if(sum==4)printf("YES\n");
else printf("NO\n");
}
return 0;
}
int Calculate_General(Chessman Chess[][MAX_SIZE],int black_x,int black_y,int red_y)
{
int i;
for(i=black_x+1;i<=10;i++)
{
if(Chess[i][black_y].x==2)continue;
if(Chess[i][black_y].x!=0&&Chess[i][black_y].ch!='G')break;
if(Chess[i][black_y].x!=0&&Chess[i][black_y].ch=='G')return 1;
}
return 0;
}
int Calculate_Chariot(Chessman Chess[][MAX_SIZE],int black_x,int black_y,int red_y)
{
int i;
for(i=black_x-1;i>=1;i--)
{
if(Chess[i][black_y].x==2)continue;
if(Chess[i][black_y].x!=0&&Chess[i][black_y].ch!='R')break;
if(Chess[i][black_y].x!=0&&Chess[i][black_y].ch=='R')return 1;
}
for(i=black_x+1;i<=10;i++)
{
if(Chess[i][black_y].x==2)continue;
if(Chess[i][black_y].x!=0&&Chess[i][black_y].ch!='R')break;
if(Chess[i][black_y].x!=0&&Chess[i][black_y].ch=='R')return 1;
}
for(i=black_y-1;i>=1;i--)
{
if(Chess[black_x][i].x==2)continue;
if(Chess[black_x][i].x!=0&&Chess[black_x][i].ch!='R')break;
if(Chess[black_x][i].x!=0&&Chess[black_x][i].ch=='R')return 1;
}
for(i=black_y+1;i<=9;i++)
{
if(Chess[black_x][i].x==2)continue;
if(Chess[black_x][i].x!=0&&Chess[black_x][i].ch!='R')break;
if(Chess[black_x][i].x!=0&&Chess[black_x][i].ch=='R')return 1;
}
return 0;
}
int Calculate_Cannon(Chessman Chess[][MAX_SIZE],int black_x,int black_y,int red_y)
{
int i,mark=0;
for(i=black_x-1;i>=1;i--)
{
if(Chess[i][black_y].x==2)continue;
if(Chess[i][black_y].x!=0&&mark==0){mark=1;continue;}
if(Chess[i][black_y].x!=0&&mark==1)
{
if(Chess[i][black_y].ch=='C')return 1;
else break;
}
}
mark=0;
for(i=black_x+1;i<=10;i++)
{
if(Chess[i][black_y].x==2)continue;
if(Chess[i][black_y].x!=0&&mark==0){mark=1;continue;}
if(Chess[i][black_y].x!=0&&mark==1)
{
if(Chess[i][black_y].ch=='C')return 1;
else break;
}
}
mark=0;
for(i=black_y-1;i>=1;i--)
{
if(Chess[black_x][i].x==2)continue;
if(Chess[black_x][i].x!=0&&mark==0){mark=1;continue;}
if(Chess[black_x][i].x!=0&&mark==1)
{
if(Chess[black_x][i].ch=='C')return 1;
else break;
}
}
mark=0;
for(i=black_y+1;i<=9;i++)
{
if(Chess[black_x][i].x==2)continue;
if(Chess[black_x][i].x!=0&&mark==0){mark=1;continue;}
if(Chess[black_x][i].x!=0&&mark==1)
{
if(Chess[black_x][i].ch=='C')return 1;
else break;
}
}
return 0;
}
int Calculate_Horse(Chessman Chess[][MAX_SIZE],int black_x,int black_y,int red_y)
{
if(black_x-2==1)
{
if(Chess[black_x-2][black_y-1].ch=='H'&&Chess[black_x-1][black_y-1].x==0)
return 1;
if(Chess[black_x-2][black_y+1].ch=='H'&&Chess[black_x-1][black_y+1].x==0)
return 1;
}
if(black_x-1>=1)
{
if(Chess[black_x-1][black_y-2].ch=='H'&&Chess[black_x-1][black_y-1].x==0)
return 1;
if(Chess[black_x-1][black_y+2].ch=='H'&&Chess[black_x-1][black_y+1].x==0)
return 1;
}
if(Chess[black_x+1][black_y-2].ch=='H'&&Chess[black_x+1][black_y-1].x==0) return 1;
if(Chess[black_x+1][black_y+2].ch=='H'&&Chess[black_x+1][black_y+1].x==0) return 1;
if(Chess[black_x+2][black_y-1].ch=='H'&&Chess[black_x+1][black_y-1].x==0) return 1;
if(Chess[black_x+2][black_y+1].ch=='H'&&Chess[black_x+1][black_y+1].x==0) return 1;
return 0;
}
int Calculate(Chessman Chess[][MAX_SIZE],int black_x,int black_y,int red_y)
{
int result1 = Calculate_General(Chess,black_x,black_y,red_y);
int result2 = Calculate_Chariot(Chess,black_x,black_y,red_y);
int result3 = Calculate_Cannon(Chess,black_x,black_y,red_y);
int result4 = Calculate_Horse(Chess,black_x,black_y,red_y);
int sum = result1+result2+result3+result4;
if(sum>=1)return 1;
return 0;
}