Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 924 Accepted Submission(s): 244
题目大意:
判断黑方是否为死棋。
思路:
果断模拟之。。。
我将一个子的杀点(该能杀到的点)和所占点(该子所在的位置)分开保存。
马注意鳖马腿.处理方法:向一个方向跳的时候,记录蹩马腿的位置,加上判断此位置是否是某子的所占点。
注意:
车的所占点,并不是他的杀点!!
帅、车的杀点,包括挡在他前面的子的所在点。
炮的杀点,包括挡在炮前面的前面的子的所在点。
这次真的感受到了出数据的力量。上面注意的三点,自己全都没考虑到。而且细节方面考虑太不周到了,调试出来后都是写不该有的失误。
模拟题还是要多练啊!!!。。。静下心,把每一步都确认好。。。
#include <cstdio>
#include <iostream>
#include <cstring>
#include <vector>
#include <algorithm>
const int inf=0x7fffffff;
using namespace std;
struct point//red pieces
{
int x;
int y;
char va;
}p[8];
int n;
int fx,fy;//black general坐标
int vis[10][9];//记录棋盘坐标上是否有red pieces
int kill[10][9];//记录轮到red走时的杀点
int hor[8][2]={{-2,-1},{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2}};//马走日
int hobo[4][2]={{-1,0},{0,1},{1,0},{0,-1}}; //判断马的蹩脚点,black pieces能走的四个方向
bool noover(int x,int y)//坐标是否在棋盘内
{
if ((x>=0)&&(x<10)&&(y>=0)&&(y<9))
return true;
else return false;
}
bool gnoover(int x,int y)//坐标是否在general能落的田字格内
{
if ((x>=0)&&(x<3)&&(y>=3)&&(y<6))
return true;
else return false;
}
void ban(point p)//找出red pieces各个可以走的杀点。
{
if ((p.va=='G')||(p.va=='R'))
{
for (int i=p.x+1;i<10;i++)//十字四个方向
{
kill[i][p.y]=1;
if (vis[i][p.y]==1)
break;
}
for (int i=p.x-1;i>=0;i--)
{
kill[i][p.y]=1;
if (vis[i][p.y]==1)
break;
}
for (int i=p.y+1;i<9;i++)
{
kill[p.x][i]=1;
if (vis[p.x][i]==1)
break;
}
for (int i=p.y-1;i>=0;i--)
{
kill[p.x][i]=1;
if (vis[p.x][i]==1)
break;
}
}
else if(p.va=='H')
{
for (int i=0;i<8;i++)
if (noover(p.x+hobo[i/2][0],p.y+hobo[i/2][1]))
if (vis[p.x+hobo[i/2][0]][p.y+hobo[i/2][1]]==0)
{
if (noover(p.x+hor[i][0],p.y+hor[i][1]))
kill[p.x+hor[i][0]][p.y+hor[i][1]]=1;
}
}
else if(p.va=='C')
{
for (int i=p.x+1;i<10;i++) //十字四个方向
if (vis[i][p.y]==1)
{
for (int j=i+1;j<10;j++)
{
kill[j][p.y]=1;
if (vis[j][p.y]==1)
break;
}
break;
}
for (int i=p.x-1;i>=0;i--)
if (vis[i][p.y]==1)
{
for (int j=i-1;j>=0;j--)
{
kill[j][p.y]=1;
if (vis[j][p.y]==1)
break;
}
break;
}
for (int i=p.y+1;i<9;i++)
if (vis[p.x][i]==1)
{
for (int j=i+1;j<9;j++)
{
kill[p.x][j]=1;
if (vis[p.x][j]==1)
break;
}
break;
}
for (int i=p.y-1;i>=0;i--)
if (vis[p.x][i]==1)
{
for (int j=i-1;j>=0;j--)
{
kill[p.x][j]=1;
if (vis[p.x][j]==1)
break;
}
break;
}
}
}
int main()
{
while(cin>>n>>fx>>fy)
{
if ((n&&fx&&fy)==0) return 0;
fx--;
fy--;
memset(vis,0,sizeof(vis));
memset(kill,0,sizeof(kill));
for (int i=0;i<n;i++)
{
cin>>p[i].va>>p[i].x>>p[i].y;
p[i].x-=1;
p[i].y-=1;
vis[p[i].x][p[i].y]=1;
}
for (int i=0;i<n;i++)
ban(p[i]);
//for (int i=0;i<10;i++)
// for (int j=0;j<9;j++)
// cout<<i<<' '<<j<<' '<<kill[i][j]<<endl;
int ok=0;
for (int i=0;i<4;i++)
if (gnoover(fx+hobo[i][0],fy+hobo[i][1]))
if (!kill[fx+hobo[i][0]][fy+hobo[i][1]])
ok=1;
if (ok)
cout<<"NO"<<endl;
else cout<<"YES"<<endl;
}
return 0;
}