Fuzhou 2011 A Xiangqi(模擬)

鏈接

題意:

給出黑將,紅馬,紅炮,紅車,紅帥,判斷黑將是否沒地方可走。


思路:

一開始想的用這些馬、炮、車、帥去圖上染色,不怎麼哪裏寫錯了一直wa,後來改爲判斷將能走的幾個位置會不會被別的棋子攻擊。



參考代碼:

#include <stdio.h>
#include <iostream>
#include <vector>
#include <string.h>
using namespace std;
typedef long long ll;
typedef pair<int,int>pii;

int mp[15][15];
int dir[8][2]={1,2,1,-2,-1,2,-1,-2,2,1,2,-1,-2,1,-2,-1};
int dirma[8][2]={1,1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,-1};
int dir2[4][2]={1,0,0,1,-1,0,0,-1};

bool judgeH(int x,int y){
    for(int i=0;i<8;i++){
        int dx=x+dir[i][0];
        int dy=y+dir[i][1];
        if(dx<1||dy<1||dx>10||dy>9)continue;//(dx,dy)是馬的位置
        int ddx=x+dirma[i][0];
        int ddy=y+dirma[i][1];
        if(mp[dx][dy]==1&&mp[ddx][ddy]==0){
            return true;
        }
    }
    return false;
}

bool judgeR(int x,int y){
    for(int i=x-1;i>0;i--){
        if(mp[i][y]){
            if(mp[i][y] == 3){
                return true;
            }
            else {
                break;
            }
        }
    }
    for(int i=x+1;i<11;i++){
        if(mp[i][y]){
            if(mp[i][y] == 3){
                return true;
            }
            else {
                break;
            }
        }
    }
    for (int j = y-1; j >= 1; j--){
        if (mp[x][j]){
            if(mp[x][j] == 3){
                return true;
            }
            else {
                break;
            }
        }
    }
    for (int j = y+1; j <10; j++){
        if (mp[x][j]){
            if(mp[x][j] == 3){
                return true;
            }
            else {
                break;
            }
        }
    }
    return false;
}

bool judgeC(int x,int y){
    for (int i = x-1; i >= 1; i--) {
        if (mp[i][y]) {
            for (int j = i - 1; j >= 1; j--) {
                if (mp[j][y]) {
                    if(mp[j][y] == 2){
                        return true;
                    }
                    else break;
                }
            }
            break;
        }
    }
    for (int i = x+1; i < 11; i++) {
        if (mp[i][y]) {
            for (int j = i + 1; j < 11; j++) {
                if (mp[j][y]) {
                    if(mp[j][y] == 2){
                        return true;
                    }
                    else break;
                }
            }
            break;
        }
    }

    for (int j = y-1; j >= 1; j--){
        if (mp[x][j]){
            for (int i = j-1; i >= 1; i--){
                if (mp[x][i]){
                    if(mp[x][i] == 2){
                        return true;
                    }
                    else break;
                }
            }
            break;
        }
    }
    for (int j = y+1; j < 10; j++){
        if (mp[x][j]){
            for (int i = j+1; i < 10; i++){
                if (mp[x][i]){
                    if(mp[x][i] == 2){
                        return true;
                    }
                    else break;
                }
            }
            break;
        }
    }
    return false;
}

bool judgeG(int x,int y){
    for (int i = x+1; i < 11; i++){
        if (mp[i][y]){
            return mp[i][y] == 4;
        }
    }
    return false;
}

int main(){
    int n,sx,sy;
    while (~scanf("%d%d%d",&n,&sx,&sy)){
        if(!n&&!sx&&!sy){
            break;
        }
        memset(mp,0, sizeof(mp));
        char op[2];
        int x,y;
        for(int i=1;i<=n;i++){
            scanf("%s%d%d",op,&x,&y);
            if(op[0]=='H'){
                mp[x][y]=1;
            }
            else if(op[0]=='C'){
                mp[x][y]=2;
            }
            else if(op[0]=='R'){
                mp[x][y]=3;
            }
            else {
                mp[x][y]=4;
            }
        }
        if(judgeG(sx,sy)){
            printf("NO\n");
            continue;
        }

        bool ff= false;
        for(int i=0;i<4;i++){
            int dx=sx+dir2[i][0];
            int dy=sy+dir2[i][1];
            if(dx<1||dx>3||dy<4||dy>6)continue;
            if(judgeH(dx,dy)||judgeC(dx,dy)||judgeG(dx,dy)||judgeR(dx,dy))continue;
            ff=true;
            break;
        }
        printf("%s\n",ff?"NO":"YES");
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章