象棋 Uva1589

在网上看到的超棒的代码:http://www.cnblogs.com/cumulonimbus/p/5184725.html

自己看完之后又重新码了一遍 QAQ 变量命名有些窒息

思路:模拟黑棋可以移动到的位置,如果每个位置都被红棋将死,则黑棋已被将死。

#include <stdio.h>
#include <string.h>
//红方可能棋子 车(R)马(H)炮(C)帅(G)
char board[12][12];
int dr[4] = {1, -1, 0, 0}, dc[4] = {0, 0, 1, -1};
int hr[8] = {2, 2, 1, 1, -2, -2, -1, -1};//马的八种走法
int hc[8] = {1, -1, 2, -2, 1, -1, 2, -2};
int hhr[4] = {1, 1, -1, -1};//蹩马腿的情况
int hhc[4] = {1, -1, 1, -1};


int check(int r, int c){
    
    int cnt = 0;
    
    //是否越界
    if(r < 1 || r > 3 || c < 4 || c > 6)
        return 1;
    
    //判断是否被红方的 车(R)炮(C)帅(G)将死
    for(int i = 0; i < 4; i++){
        int rh = r + dr[i];
        int ch = c + dc[i];
        for(;rh > 0 && rh <= 10 && ch > 0 && ch <= 9; rh += dr[i], ch += dc[i]){
            if(board[rh][ch]){
                if((board[rh][ch] == 'R' || board[rh][ch] == 'G') && cnt == 0)
                    return 1;
                //注意两个炮在同一直线上也能将死
                else if(board[rh][ch] == 'C' && cnt == 1)
                    return 1;
                cnt++;
            }
        }
    }
    
    //判断是否被红方的 马(H)将死
    for(int i = 0; i < 8; i++){
        int rh = r + hr[i];
        int ch = c + hc[i];
        
        if(rh > 0 && rh <= 10 && ch > 0 && ch <= 9){
            for(int j = 0; j < 4; j++)
                if(board[rh][ch] == 'H' && (!board[r+hhr[i]][c+hhc[i]]))
                    return 1;
        }
    }
    
    
    return 0;
}

//黑方只剩一个将
int main(){
    int n, black_r, black_c;
    char s[5];
    int red_r, red_c;
    int cnt = 0;
        
    memset(board, 0, sizeof(board));

    while(scanf("%d %d %d", &n, &black_r, &black_c) == 3 && n){
        for(int i = 0; i < n; i++){
            scanf("%s %d %d", &s[i], &red_r, &red_c);
            board[red_r][red_c] = s[0];//存储红方棋子
        }
        
        for(int i = 0; i < 4; i++){
            cnt += check(black_r + dr[i], black_c + dc[i]);
        }
        
        if(cnt == 4)
            printf("yes\n");
        else
            printf("no\n");
    }
    
    return 0;
}

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值