poj4001 Xiangqi

本文介绍了一种基于象棋棋盘的模拟算法实现方案,通过分析不同棋子的走法来判断安全区域。代码中使用了C++进行实现,并考虑到了不同棋子如车、马等的具体走法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

象棋,顾名思义,大模拟...注意细节问题,然后有棋子的地方也可以是安全区,因为将可以吃子

在输入上wa了几发

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;

bool mat[15][15];
bool ma[15][15];

typedef struct node{
    char p;
    int x,y;
};
node p[105];

void judge(node a){
     int r,c;
     r=a.y;
     c=a.x;
     if(a.p=='G'){
        for(int i=r-1;i>0;i--){
            mat[i][c] = 1;
            if(ma[i][c]==1) break;
        }
     }
     if(a.p=='R'){
        for(int i=c+1;i<10;i++){//right
            mat[r][i] = 1;
            if(ma[r][i]) break;
        }
        for(int i=c-1;i>=1;i--){//left
            mat[r][i] = 1;
            if(ma[r][i]) break;
        }
        for(int i=r+1;i<10;i++){//down
            mat[i][c] = 1;
            if(ma[i][c]) break;
        }
        for(int i=r-1;i>=1;i--){//up
            mat[i][c]=1;
            if(ma[i][c]) break;
        }
     }
     if(a.p=='C'){
        bool flag=false;
        for(int i=c+1;i<10;i++){//right
            if(flag){
                mat[r][i] = 1;
                if(ma[r][i]) break;
            }
            if(ma[r][i]){
                flag=true;
            }
        }
        flag=false;
        for(int i=c-1;i>=1;i--){//left
            if(flag){
                mat[r][i] = 1;
                if(ma[r][i]) break;
            }
            if(ma[r][i]){
                flag=true;
            }
        }
        flag=false;
        for(int i=r+1;i<=10;i++){//down
            if(flag){
                mat[i][c] = 1;
                if(ma[i][c]) break;
            }
            if(ma[i][c]){
                flag=true;
            }
        }
        flag=false;
        for(int i=r-1;i>=1;i--){//up
            if(flag){
                mat[i][c] = 1;
                if(ma[i][c]) break;
            }
            if(ma[i][c]){
                flag=true;
            }
        }
     }
     if(a.p=='H'){
        if(!ma[r-1][c]&&r>1){
            mat[r-2][c+1]=mat[r-2][c-1]=1;
        }
        if(!ma[r+1][c]){
            mat[r+2][c+1]=mat[r+2][c-1]=1;
        }
        if(!ma[r][c+1]){
            mat[r+1][c+2]=mat[r-1][c+2]=1;
        }
        if(!ma[r][c-1]&&c>1){
            mat[r+1][c-2]=mat[r-1][c-2]=1;
        }
     }
}

int gox[4]={0,0,-1,1},goy[4]={-1,1,0,0};


int main()
{
    int n,x,y,r,c;
    bool flag;
    while(~scanf("%d%d%d",&n,&y,&x)){
            if(n==0&&x==0&&y==0) break;
        flag=false;
        memset(mat,0,sizeof(mat));
        memset(ma,0,sizeof(ma));
        for(int i=0;i<n;i++){
            cin>>p[i].p>>r>>c;
            p[i].x=c;
            p[i].y=r;
            ma[r][c]=1;
        }
        for(int i=0;i<n;i++){
            judge(p[i]);
        }
        for(int i=0;i<4;i++){
            r=y+goy[i];
            c=x+gox[i];
            if(r>=1&&c>=4&&r<=3&&c<=6){
                if(!mat[r][c]) flag=true;
            }
        }
        if(flag){
            printf("NO\n");
        }
        else printf("YES\n");
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值