连接地址: http://ac.nbutoj.com/Problem/view.xhtml?id=1002
在做此题之前,你首先要知道中国象棋的游戏规则吧,不知道的看说明书去。
问题很简单,就是让你判断当时的局面是否存在将军状态。
首先,我们先想想,可以产生将军的棋子是哪些?
兵提步,判断将帅周围的三格是否有对方的兵。
炮跳轰,判断将帅所在的两条坐标线上是否有对方的炮,且将帅与炮中间必须存在有且仅有一个棋子。
马跳扑,判断将帅周围的八个格子是否有对方的马,且注意马的跛脚。
车直飞,判断将帅所在的两条坐标线上是否有对方的车,且将帅与车中间不能存在任何棋子。
将帅对,判断将与帅是否相对,条件是他们所在的那条直线上,他们之间不能存在任何棋子。
好了,先建立一个二维数组作棋盘,把各棋子都输入到棋盘里去。
然后遍历一下就可以了。
关键是思路一定要清晰。
以下是我AC的代码:
#include <iostream>
#include <cstdio>
using namespace std;
//地图
int map[11][10];
//马的跳跃
int f[8][2]={{-1,-2},{-2,-1},{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2}};
//马的蹩脚
int ff[8][2]={{0,-1},{-1,0},{-1,0},{0,1},{0,1},{1,0},{1,0},{0,-1}};
//车的移动
int fff[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
int main()
{
int i,j,k,l,n,x,y,xx,yy,p,count;
scanf("%d",&n);
for (i=0;i<n;i++)
{
p=0;
for (j=0;j<10;j++)
{
for (k=0;k<9;k++)
{
scanf("%d",&map[j][k]);
}
}
for (j=0;j<10;j++)
{
if (p) break;
for (k=0;k<9;k++)
{
//空地
if (map[j][k]==0) continue;
//将
if (map[j][k]==1)
{
x=j+1;
y=k;
while (1)
{
if (map[x][y]!=0&&map[x][y]!=17) break;
if (x==7||x==8||x==9)
{
if (map[x][y]==17)
{
p=1;
break;
}
}
if (x==9) break;
x++;
}
if (p==1) break;
}
//帅
else if (map[j][k]==17)
{
x=j-1;
y=k;
while (1)
{
if (map[x][y]!=0&&map[x][y]!=1) break;
if (x==2||x==1||x==0)
{
if (map[x][y]==1)
{
p=1;
break;
}
}
if (x==0) break;
x--;
}
if (p==1) break;
}
//黑马
else if (map[j][k]==6||map[j][k]==7)
{
for (l=0;l<8;l++)
{
x=j+f[l][0];
y=k+f[l][1];
if (x>=0&&y>=0&&x<10&&y<9)
{
xx=j+ff[l][0];
yy=k+ff[l][1];
if (map[x][y]==17&&map[xx][yy]==0)
{
p=1;
break;
}
}
}
if (p==1) break;
}
//红马
else if (map[j][k]==22||map[j][k]==23)
{
for (l=0;l<8;l++)
{
x=j+f[l][0];
y=k+f[l][1];
if (x>=0&&y>=0&&x<10&&y<9)
{
xx=j+ff[l][0];
yy=k+ff[l][1];
if (map[x][y]==1&&map[xx][yy]==0)
{
p=1;
break;
}
}
}
if (p==1) break;
}
//黑车
else if (map[j][k]==8||map[j][k]==9)
{
for (l=0;l<4;l++)
{
x=j+fff[l][0];
y=k+fff[l][1];
if (x<0||y<0||x>9||y>8) continue;
while (1)
{
if (map[x][y]!=0&&map[x][y]!=17) break;
if (map[x][y]==17)
{
p=1;
break;
}
x+=fff[l][0];
y+=fff[l][1];
if (x<0||y<0||x>9||y>8) break;
}
if (p==1) break;
}
}
//红车
else if (map[j][k]==24||map[j][k]==25)
{
for (l=0;l<4;l++)
{
x=j+fff[l][0];
y=k+fff[l][1];
if (x<0||y<0||x>9||y>8) continue;
while (1)
{
if (map[x][y]!=0&&map[x][y]!=1) break;
if (map[x][y]==1)
{
p=1;
break;
}
x+=fff[l][0];
y+=fff[l][1];
if (x<0||y<0||x>9||y>8) break;
}
if (p==1) break;
}
}
//黑炮
else if (map[j][k]==10||map[j][k]==11)
{
for (l=0;l<4;l++)
{
count=0;
x=j+fff[l][0];
y=k+fff[l][1];
if (x<0||y<0||x>9||y>8) continue;
while (1)
{
if (count==2) break;
if (map[x][y]==17&&count==1)
{
p=1;
break;
}
if (map[x][y]!=0&&map[x][y]!=17) count++;
x+=fff[l][0];
y+=fff[l][1];
if (x<0||y<0||x>9||y>8) break;
}
if (p==1) break;
}
}
//红炮
else if (map[j][k]==26||map[j][k]==27)
{
for (l=0;l<4;l++)
{
count=0;
x=j+fff[l][0];
y=k+fff[l][1];
if (x<0||y<0||x>9||y>8) continue;
while (1)
{
if (count==2) break;
if (map[x][y]==1&&count==1)
{
p=1;
break;
}
if (map[x][y]!=0&&map[x][y]!=1) count++;
x+=fff[l][0];
y+=fff[l][1];
if (x<0||y<0||x>9||y>8) break;
}
if (p==1) break;
}
}
//黑兵
else if (map[j][k]==12||map[j][k]==13||map[j][k]==14||map[j][k]==15||map[j][k]==16)
{
if (k==0||k==8) continue;
if (j==9)
{
if (map[j][k-1]==17||map[j][k+1]==17)
{
p=1;
break;
}
}
else if (map[j][k-1]==17||map[j+1][k]==17||map[j][k+1]==17)
{
p=1;
break;
}
}
//红兵
else if (map[j][k]==28||map[j][k]==29||map[j][k]==30||map[j][k]==31||map[j][k]==32)
{
if (k==0||k==8) continue;
if (j==0)
{
if (map[j][k-1]==1||map[j][k+1]==1)
{
p=1;
break;
}
}
else if (map[j][k-1]==1||map[j-1][k]==1||map[j][k+1]==1)
{
p=1;
break;
}
}
}
if (k!=9||p==1)
{
p=1;
cout<<"yes"<<endl;
break;
}
}
if (p==0) cout<<"no"<<endl;
}
return 0;
}