开始碰到这个题时觉得太麻烦了直接跳过没做,现在放假了再次看这个题发现没有想象中那么麻烦,主要是题目理解要透彻,基本思路就是用结构体数组存下红方棋子,让黑将军每次移动一下,看移动后是否有一个红方棋子可以吃掉它,这样做黑将军吃子这一情况就可以完美的跳过了,因为只看不在黑将军移动后位置的棋子是否能吃掉他。二维数组模拟棋盘,注意皇宫,玩过象棋的应该对规则比较熟悉,注意憋马脚的情况,不懂得可以看看中国象棋的规则。下面附上我的AC代码,主要是输入那块很烦,只是用getchar()读掉一个回车的话本地测试是对的,交上去却会出现问题,只好用字符串读,然后取首字母。
AC代码:
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 struct qi{ 6 char name; 7 int x, y; 8 }hei, qizi[10]; 9 int qipan[15][15], n; 10 int judge(); 11 int deal(int a, int b); 12 int H(int, int, int, int); 13 int C(int, int, int, int); 14 int R(int, int, int, int); 15 int main() 16 { 17 char s[5]; 18 while(scanf("%d %d %d", &n, &hei.x, &hei.y) == 3 && n && hei.x && hei.y) 19 { 20 memset(qipan,0,sizeof(qipan)); 21 int i; 22 for(i = 0; i < n; i++) 23 { 24 scanf("%s %d %d", s, &qizi[i].x, &qizi[i].y); 25 qizi[i].name = s[0]; 26 qipan[qizi[i].x][qizi[i].y] = qizi[i].name; 27 } 28 printf("%s ", judge() ? "YES" : "NO"); 29 } 30 return 0; 31 } 32 33 int judge() 34 { 35 int i; 36 for(i = hei.x; i <= 10; i++) 37 { 38 if(qipan[i][hei.y] != 0) 39 { 40 if(qipan[i][hei.y] == 'G') return 0; 41 else break; 42 } 43 } 44 if(hei.x > 1 && deal(hei.x - 1, hei.y)) return 0; 45 else if(hei.x < 3 && deal(hei.x + 1, hei.y)) return 0; 46 else if(hei.y > 4 && deal(hei.x, hei.y - 1)) return 0; 47 else if(hei.y < 6 && deal(hei.x, hei.y + 1)) return 0; 48 return 1; 49 } 50 51 int deal(int a, int b) 52 { 53 int i; 54 for(i = 0; i < n; i++) 55 { 56 if(qizi[i].x == a && qizi[i].y == b) 57 continue; 58 if(qizi[i].name == 'R' || qizi[i].name == 'G') 59 { 60 if(R(qizi[i].x, qizi[i].y, a, b)) 61 return 0; 62 } 63 else if(qizi[i].name == 'C') 64 { 65 if(C(qizi[i].x, qizi[i].y, a, b)) 66 return 0; 67 } 68 else if(qizi[i].name == 'H') 69 { 70 if(H(qizi[i].x, qizi[i].y, a, b)) 71 return 0; 72 } 73 } 74 return 1; 75 } 76 77 int H(int x, int y, int a, int b) 78 { 79 if(qipan[x + 1][y] == 0 && x + 2 == a && (y - 1 == b || y + 1 == b)) 80 return 1; 81 if(qipan[x - 1][y] == 0 && x - 2 == a && (y - 1 == b || y + 1 == b)) 82 return 1; 83 if(qipan[x][y + 1] == 0 && y + 2 == b && (x - 1 == a || x + 1 == a)) 84 return 1; 85 if(qipan[x][y - 1] == 0 && y - 2 == b && (x - 1 == a || x + 1 == a)) 86 return 1; 87 return 0; 88 } 89 90 int C(int x, int y, int a, int b) 91 { 92 int i; 93 if(x == a) 94 { 95 int min = y > b ? b : y; 96 int max = y > b ? y : b; 97 int num = 0; 98 for(i = min + 1; i < max; i++) 99 if(qipan[x][i]) 100 num++; 101 if(num == 1) 102 return 1; 103 return 0; 104 } 105 if(y == b) 106 { 107 int min = x > a ? a : x; 108 int max = x > a ? x : a; 109 int num = 0; 110 for(i = min + 1; i < max; i++) 111 if(qipan[i][y]) 112 num++; 113 if(num == 1) 114 return 1; 115 return 0; 116 } 117 return 0; 118 } 119 120 int R(int x, int y, int a, int b) 121 { 122 int i; 123 if(x == a) 124 { 125 int min = y > b ? b : y; 126 int max = y > b ? y : b; 127 for(i = min + 1; i < max; i++) 128 if(qipan[x][i] != 0) 129 return 0; 130 return 1; 131 } 132 if(y == b) 133 { 134 int min = x > a ? a : x; 135 int max = x > a ? x : a; 136 for(i = min + 1; i < max; i++) 137 if(qipan[i][y] != 0) 138 return 0; 139 return 1; 140 } 141 return 0; 142 }