您的位置:首页 > 其它

紫书章四习题一 xiangqi uva 1589(模拟)

2017-04-03 19:55 405 查看
题意:黑棋只有一个将,红棋还有帅,马,车,炮,中的几个,然后问,现在的局面是不是将死。什么是将死呢?就是下一步黑棋的将无论走到哪里,都是死路一条。(那如果是帅无论走到哪都是死路的话,那是不是….帅死?)

然后想法是将红棋的攻击范围都标记出来,如果之后将可以走的地方都在红棋的攻击范围中的话,就代表将死,否则代表没有将死。

(自己有时候还是太粗心。。。想干脆换个人设算了(摊手)。。)

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cmath>
using namespace std;
int bl[15][15],re[15][15];
int M[15][15];
int main()
{
int n,x,y;
while(scanf("%d %d %d",&n,&y,&x)!=EOF&&n+x+y){
memset(bl,0,sizeof(bl));
memset(re,0,sizeof(re));
memset(M,0,sizeof(M));
for(int i=1;i<=3;i++){
for(int j=4;j<=6;j++){
if(i==y&&abs(x-j)==1)
bl[i][j]=1;
if(j==x&&abs(y-i)==1)
bl[i][j]=1;
}
}
for(int i=0;i<n;i++)
{
char c;
int a,b;
cin>>c>>a>>b;
re[a][b]=c;
}
int gg=0;
for(int i=1;i<=10;i++)
{
for(int j=1;j<=9;j++)
{
if(re[i][j]=='G'||re[i][j]=='R'){
if(re[i][j]=='G')
{
int g=0;
if(j==y){
for(int h=i-1;h>y;h--)
{
if(re[h][j]) {g=1;break;}
}
if(!g) gg=1;
for(int h=i+1
4000
;h<y;h++)
{
if(re[h][j]) {g=1;break;}
}
if(!g) gg=1;
}
}
if(gg) break;
int k;
for(k=i-1;k>=1;k--)//above
{
M[k][j]=1;
if(re[k][j]) break;
}
for(k=i+1;k<=10;k++)//xia
{
M[k][j]=1;
if(re[k][j]) break;
}
for(k=j-1;k>=1;k--)//left
{
M[i][k]=1;
if(re[i][k]) break;
}
for(k=j+1;k<=9;k++)//right
{
M[i][k]=1;
if(re[i][k]) break;
}
}
if(re[i][j]=='H')
{
if(i-2>=1&&!re[i-1][j]){
if(j-1>=1)
M[i-2][j-1]=1;
if(j+1<=9)
M[i-2][j+1]=1;
}
if(i+2<=10&&!re[i+1][j]){
if(j-1>=1)
M[i+2][j-1]=1;
if(j+1<=9)
M[i+2][j+1]=1;
}
if(j-2>=1&&!re[i][j-1])
{
if(i-1>=1)
M[i-1][j-2]=1;
if(i+1<=10)
M[i+1][j-2]=1;
}
if(j+2<=9&&!re[i][j+1])
{
if(i-1>=1)
M[i-1][j+2]=1;
if(i+1<=10)
M[i+1][j+2]=1;
}
}
if(re[i][j]=='C')
{
int k,flag=0;
for(k=i-1;k>=1;k--)//above
{
if(re[k][j]) {flag=1;break;}
}
if(flag){
for(k=k-1;k>=1;k--)
{
M[k][j]=1;
if(re[k][j]) break;
}
}
flag=0;
for(k=i+1;k<=10;k++)//xia
{
if(re[k][j]){flag=1;break;}
}
if(flag)
{
for(k=k+1;k<=10;k++){
M[k][j]=1;
if(re[k][j]) break;
}
}
flag=0;
for(k=j-1;k>=1;k--)//left
{
if(re[i][k]){flag=1;break;}
}
if(flag){
for(k=k-1;k>=1;k--)
{
M[i][k]=1;
if(re[i][k]) break;
}
}
flag=0;
for(k=j+1;k<=9;k++)//right
{
if(re[i][k]) {flag=1;break;}
}
if(flag)
{
for(k=k+1;k<=9;k++)
{
M[i][k]=1;
if(re[i][k]) break;
}
}
}
}
if(gg) break;
}
if(gg) printf("NO\n");
else {
int ans=0;
for(int i=1;i<=3;i++){
for(int j=4;j<=6;j++){
if(bl[i][j]==1&&M[i][j]==0)
{
ans=1; break;
}
}
}
if(ans) printf("NO\n");
else printf("YES\n");
}
}
return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: