在网上看到的超棒的代码: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;
}