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的主要内容,如果未能解决你的问题,请参考以下文章

UVA1589 Xiangqi(挖坑待填)

Xiangqi UVA - 1589

Xiangqi UVa1589(多次WA)

紫书第四章训练 UVA1589 Xiangqi by 15 周泽玺

习题4-1 Xiangqi UVA - 1589

uva1589(象棋)。