题目链接:hdu 4121
判断所给棋盘黑方是不是被将死了,黑方所有移动判断一下就好
/******************************************************
* File Name: h.cpp
* Author: kojimai
* Creater Time:2014年08月17日 星期日 14时16分46秒
******************************************************/
/*
*给一个象棋的棋局,黑方只剩下一个将,红方剩下帅,马,炮,车中的几个,问能否将黑方将死
*大模拟,判断出黑方所有有没有可能不被将死的行动即可
**对红方所有剩余棋子,找出它们会将军的位置
*/
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
using namespace std;
bool vis[15][15],che[15][15];
struct node
{
int x,y;
char ch;
}p[8];
void jiang(int x,int y)//帅会将的位置
{
for(int i=x-1;i>=1;i--)//上方一条
{
if(!vis[i][y])
{
che[i][y]=true;
}
else
break;
}
return;
}
void ju(int x,int y)//车能将到的位置
{
for(int i=x-1;i>=1;i--)//上方
{
if(vis[i][y])
break;
che[i][y]=true;
}
for(int i=x+1;i<=3;i++)//下方
{
if(vis[i][y])
break;
che[i][y]=true;
}
for(int j=y+1;j<=6;j++)//右边
{
if(vis[x][j])
break;
che[x][j]=true;
}
for(int j=y-1;j>=4;j--)//左边
{
if(vis[x][j])
break;
che[x][j]=true;
}
return;
}
void ma(int x,int y)//马能将到的位置
{
if(x==1)//down
{
if(!vis[2][y])
{
if(y+1<=6)
che[3][y+1]=true;
if(y-1>=4)
che[3][y-1]=true;
}
}
if(x>=3)//up
{
if(!vis[x-1][y])
{
if(y+1<=6&&y+1>=4)
che[x-2][y+1]=true;
if(y-1<=6&&y-1>=4)
che[x-2][y-1]=true;
}
}
if(y+1<=9&&!vis[x][y+1])
{
if(y+2>=4&&y+2<=6&&x+1<=3)
che[x+1][y+2]=true;
if(y+2>=4&&y+2<=6&&x-1>=1)
che[x-1][y+2]=true;
}
if(y>=3&&!vis[x][y-1])
{
if(y-2>=4&&y-2<=6&&x+1<=3)
che[x+1][y-2]=true;
if(y-2>=4&&y-2<=6&&x-1>=1)
che[x-1][y-2]=true;
}
return;
}
void pao(int x,int y)//炮能将到的位置
{
if(x>=1&&x<=3)
{
bool flag=false;
for(int i=y+1;i<=6;i++)
{
if(vis[x][i])
{
if(!flag)
flag=true;
else
break;
}
else if(flag)
che[x][i]=true;
}
flag=false;
for(int i=y-1;i>=4;i--)
{
if(vis[x][i])
{
if(!flag)
flag=true;
else
break;
}
else if(flag)
che[x][i]=true;
}
}
if(y>=4&&y<=6)
{
bool flag = false;
for(int i=x+1;i<=3;i++)
{
if(vis[i][y])
{
if(flag)
break;
else
flag=true;
}
else if(flag)
che[i][y]=true;
}
flag=false;
for(int i=x-1;i>=1;i--)
{
if(vis[i][y])
{
if(flag)
break;
else flag=true;
}
else if(flag)
che[i][y]=true;
}
}
return;
}
bool check(int x,int y,int n)//看黑方移动到x,y位置能否不被将死
{
memset(vis,false,sizeof(vis));
memset(che,false,sizeof(che));
for(int i=0;i<n;i++)
{
if(p[i].x==x&&p[i].y==y)
continue;
vis[p[i].x][p[i].y]=true;
}
for(int i=0;i<n;i++)
{
if(p[i].x==x&&p[i].y==y)
continue;
if(p[i].ch=='G')
{
jiang(p[i].x,p[i].y);
}
else if(p[i].ch=='R')
{
ju(p[i].x,p[i].y);
}
else if(p[i].ch=='H')
{
ma(p[i].x,p[i].y);
}
else
pao(p[i].x,p[i].y);
}
if(!che[x][y])
return true;
else return false;
}
int main()
{
int n,x,y;
while(cin>>n>>x>>y)
{
if(x+y+n==0)break;
for(int i=0;i<n;i++)
{
cin>>p[i].ch>>p[i].x>>p[i].y;
}
if(x>1)
{
if(check(x-1,y,n))
{
printf("NO\n");
continue;
}
}
if(x<3)
{
if(check(x+1,y,n))
{
printf("NO\n");
continue;
}
}
if(y<6)
{
if(check(x,y+1,n))
{
printf("NO\n");
continue;
}
}
if(y>4)
{
if(check(x,y-1,n))
{
printf("NO\n");
continue;
}
}
printf("YES\n");
}
return 0;
}