UVA1589----xiangqi

本文提供了一段C++代码,用于模拟中国象棋中一方是否能将死对方的将军。通过实现各种棋子的走法及判断逻辑,该代码能够有效评估特定布局下是否存在将军并导致被将军方无路可逃的情况。

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

这道题很简单,直接模拟棋盘可以得出,注意一下特殊情况即可;

 

代码如下,仅视纪念

 

#include <iostream>

#include <stdio.h>

#include <string.h>

using namespace std;

 

 

int Gplacex,Gplacey;

 

void printboard(char board[10][9]){

    for(int i=0;i<10;i++){

        for(int j=0;j<9;j++){

            if(board[i][j]==0){

                printf("OO");

            }else if(board[i][j]==1){

                printf("KK");

            }else{

                printf("%c ",board[i][j]);

            }

        }

        printf("\n");

    }

}

int judge(int x,int y,char boardr[10][9]){//杀不掉返回0,杀掉返回1

    char board[10][9];

    int i,j;

    for(i=0;i<10;i++){

        for(j=0;j<9;j++){

            board[i][j]=boardr[i][j];

        }

    }

    board[x][y]=0;

    for(i=0;i<10;i++){

        for(j=0;j<9;j++){

            if(board[i][j]=='G'&&j==y)

                {

                    int Gflag=1;

                    if(x>i)

                    {

                        for(int z=i+1; z<x; z++)

                        {

                            if(board[z][j]=='G'||board[z][j]=='R'||board[z][j]=='H'||board[z][j]=='C')

                            {

                                Gflag=0;

                                break;

                            }

                        }

                    }

                    else

                    {

                        for(int z=x+1; z<i; z++)

                        {

                            if(board[z][j]=='G'||board[z][j]=='R'||board[z][j]=='H'||board[z][j]=='C')

                            {

                                Gflag=0;

                                break;

                            }

                        }

                    }

                    if(Gflag)

                    {

                        return 1;//帅将军解决,不采用棋盘赋值法,直接判断法

                    }

                }

            if(board[i][j]=='R'){

                for(int Rx=i+1;Rx<10&&(board[Rx][j]==0||board[Rx][j]==1);Rx++){

                    board[Rx][j]=1;

                }

                for(int Rx=i-1;Rx>=0&&(board[Rx][j]==0||board[Rx][j]==1);Rx--){

                    board[Rx][j]=1;

                }

                for(int Ry=j+1;Ry<9&&(board[i][Ry]==0||board[i][Ry]==1);Ry++){

                    board[i][Ry]=1;

                }

                for(int Ry=j-1;Ry>=0&&(board[i][Ry]==0||board[i][Ry]==1);Ry--){

                    board[i][Ry]=1;

                }//车解决

            }else if(board[i][j]=='C'){

                for(int Rx=i+1,flag=0;Rx<10;Rx++){

                    if(flag==1){

                        if(board[Rx][j]==0||board[Rx][j]==1){

                            board[Rx][j]=1;

                        }else{

                            break;

                        }

                    }

                    if(board[Rx][j]!=1&&board[Rx][j]!=0){

                        flag=1;

                    }

                }

                for(int Rx=i-1,flag=0;Rx>=0;Rx--){

                    if(flag==1){

                        if(board[Rx][j]==0||board[Rx][j]==1){

                            board[Rx][j]=1;

                        }else{

                            break;

                        }

                    }

                    if(board[Rx][j]!=1&&board[Rx][j]!=0){

                        flag=1;

                    }

                }

                for(int Ry=j+1,flag=0;Ry<9;Ry++){

                    if(flag==1){

                        if(board[i][Ry]==0||board[i][Ry]==1){

                            board[i][Ry]=1;

                        }else{

                            break;

                        }

                    }

                    if(board[i][Ry]!=1&&board[i][Ry]!=0){

                        flag=1;

                    }

                }

                for(int Ry=j-1,flag=0;Ry>=0;Ry--){

                    if(flag==1){

                        if(board[i][Ry]==0||board[i][Ry]==1){

                            board[i][Ry]=1;

                        }else{

                            break;

                        }

                    }

                    if(board[i][Ry]!=1&&board[i][Ry]!=0){

                        flag=1;

                    }

                }//炮解决

            }else if(board[i][j]=='H'){

                if(i>=2&&(board[i-1][j]==0||board[i-1][j]==1)){

                    if(j>=1&&board[i-2][j-1]==0){

                        board[i-2][j-1]=1;

                    }

                    if(j<=7&&board[i-2][j+1]==0){

                        board[i-2][j+1]=1;

                    }

                }

                if(i<=7&&(board[i+1][j]==0||board[i+1][j]==1)){

                    if(j>=1&&board[i+2][j-1]==0){

                        board[i+2][j-1]=1;

                    }

                    if(j<=7&&board[i+2][j+1]==0){

                        board[i+2][j+1]=1;

                    }

                }

                if(j<=6&&(board[i][j+1]==0||board[i][j+1]==1)){

                    if(i>=1&&board[i-1][j+2]==0){

                        board[i-1][j+2]=1;

                    }

                    if(i<=8&&board[i+1][j+2]==0){

                        board[i+1][j+2]=1;

                    }

                }

                if(j>=2&&(board[i][j-1]==0||board[i][j-1]==1)){

                    if(i>=1&&board[i-1][j-2]==0){

                        board[i-1][j-2]=1;

                    }

                    if(i<=8&&board[i+1][j-2]==0){

                        board[i+1][j-2]=1;

                    }

                }//马解决

            }

        }

    }

    //printf("x=%d,y=%d\n",x+1,y+1);

    //printboard(board);

    return board[x][y];

}

 

bool isKill(int x,int y,char board[10][9]){

    x-=1;

    y-=1;

 

    //printboard(board);

 

 

    if(y==Gplacey){

        int flagt=1;

        if(x<Gplacex){

            for(int z=x+1;z<Gplacex;z++){

                if(board[z][y]!=0){

                    flagt=0;

                    break;

                }

            }

        }else{

            for(int z=Gplacex-1;z>x;z--){

                if(board[z][y]!=0){

                    flagt=0;

                    break;

                }

            }

        }

        if(flagt==1){

            return false;

        }

    }

    //考虑一下把对面将死的情况

    int flag=1;

    if(x-1>=0){

        flag*=judge(x-1,y,board);

    }

    if(x+1<=2){

        flag*=judge(x+1,y,board);

    }

    if(y-1>=3){

        flag*=judge(x,y-1,board);

    }

    if(y+1<=5){

        flag*=judge(x,y+1,board);

    }

    if(flag){

        return true;

    }else{

        return false;

    }

}

 

 

 

int main()

{

    int amount,EGx,EGy;

    while((cin>>amount>>EGx>>EGy)&&amount){

        char board[10][9];

        memset(board,0,sizeof(board));

        for(int i=0;i<amount;i++){

            char cheese;

            int Cx,Cy;

            cin>>cheese>>Cx>>Cy;

            board[Cx-1][Cy-1]=cheese;

            if(cheese=='G'){

                Gplacex=Cx-1;

                Gplacey=Cy-1;

            }

        }

        if(isKill(EGx,EGy,board)){

            printf("YES\n");

        }else{

            printf("NO\n");

        }

    }

    return 0;

}

 

 

ps:似乎输入有问题,改成C++输入方式才正确

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值