UVA 1589 Xiangqi
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVA 1589 Xiangqi相关的知识,希望对你有一定的参考价值。
Z1589 - Xiangqi
Time limit: 3.000 seconds
做这题的时候WA了很多次。
解决思路是,枚举黑方将军可以移动的位置,接着判断这些位置是否被红方将军,如果所有位置会被红方吃掉,那么就是checkmate了。
要注意的情况可能就是双炮将军。
1 #include <cstdio> 2 #include <cstring> 3 using namespace std; 4 5 char board[12][12]; 6 int dr[4] = { 1, -1, 0, 0 }, dc[4] = { 0, 0, 1, -1 }; 7 int chr[4] = { 0, 0, 1, -1 }, chc[4] = { 1, -1, 0, 0 }; 8 int hr[8] = { -2, -1, -2, -1, 1, 2, 1, 2 }; 9 int hc[8] = { -1, -2, 1, 2, -2, -1, 2, 1 }; 10 int hlr[8] = { -1, -1, -1, -1, 1, 1, 1, 1 };//绊马脚 11 int hlc[8] = { -1, -1, 1, 1, -1, -1, 1, 1 }; 12 int check(int, int); 13 14 int main() 15 { 16 int n, bgr, bgc, r, c, cnt; 17 char s[5]; 18 while (scanf("%d%d%d", &n, &bgr, &bgc) == 3 && n && bgr && bgc) 19 { 20 cnt = 0; 21 memset(board, 0, sizeof(board)); 22 for (int i = 0; i < n; i++){ 23 scanf("%s%d%d", s, &r, &c); 24 board[r][c] = s[0]; 25 } 26 27 //黑方将军移动 28 for (int i = 0; i < 4; i++) 29 cnt += check(bgr + dr[i], bgc + dc[i]); 30 if (cnt >= 4) printf("YES\n"); 31 else printf("NO\n"); 32 } 33 } 34 35 int check(int r, int c) 36 { 37 if (r < 1 || r > 3 || c < 4 || c > 6) return 1; 38 39 //判断是否被红方的车,帅,炮将军 40 for (int i = 0; i < 4; i++) 41 { 42 int cnt = 0; 43 int nr = r + chr[i], nc = c + chc[i];//黑方将军位置不判断 44 for (; 0 < nr&&nr <= 10 && 0 < nc&&nc <= 9; nr += chr[i], nc += chc[i]){ 45 if (board[nr][nc]){ 46 if ((board[nr][nc] == ‘R‘ || board[nr][nc] == ‘G‘)&&cnt==0) return 1; 47 else if (board[nr][nc] == ‘C‘&&cnt==1) return 1; 48 cnt++; 49 } 50 } 51 } 52 53 //判断是否被红方的马将军 54 for (int i = 0; i < 8; i++) 55 { 56 int nr = r + hr[i], nc = c + hc[i]; 57 if (0 < nr&&nr <= 10 && 0 < nc&&nc <= 9 && 58 board[nr][nc] == ‘H‘&&!board[r + hlr[i]][c + hlc[i]]) 59 return 1; 60 } 61 return 0; 62 }
以上是关于UVA 1589 Xiangqi的主要内容,如果未能解决你的问题,请参考以下文章