一、题目
考虑一个残局,其中红方有n个棋子,黑方只有一个将,红方除了帅以外还有:车(R)、马(H)、炮(C)三种可能得棋子,并且考虑"蹩马脚"和将帅不能照面。输入所有棋子位置坐标,保证局面合法且红方已被将军。你任务是判断红方是否已被黑方将死。
二、思路
用两个二维数组,一个存所有棋子的位置,一个记录所有棋子的死伤范围。要考虑黑将吃子的情况(所以本身不能包括在杀伤范围内)。写3个杀伤函数(帅可以看作车),判断将向4个方向移动,是否有不再杀伤范围内的。
三、代码
1 #include<stdio.h> 2 #include<string.h> 3 #include<iostream> 4 using namespace std; 5 char pieces[11][10]; 6 char range[11][10]; 7 int pos[8][3]; 8 9 void RG(int x, int y) 10 { 11 for (int i = x - 1; i >= 1; i--) 12 { 13 range[i][y] = 'S'; 14 if (pieces[i][y] != 'A' && pieces[i][y] != 'B') break; 15 } 16 for (int i = x + 1; i <= 10; i++) 17 { 18 range[i][y] = 'S'; 19 if (pieces[i][y] != 'A' && pieces[i][y] != 'B') break; 20 } 21 for (int i = y - 1; i >= 1; i--) 22 { 23 range[x][i] = 'S'; 24 if (pieces[x][i] != 'A' && pieces[x][i] != 'B') break; 25 } 26 for (int i = y + 1; i <= 9; i++) 27 { 28 range[x][i] = 'S'; 29 if (pieces[x][i] != 'A' && pieces[x][i] != 'B') break; 30 } 31 } 32 void C(int x, int y) 33 { 34 int i, j; 35 for (i = x-1; i >= 1; i--) 36 { 37 if (pieces[i][y] == 'B') return; 38 if (pieces[i][y] != 'A') break; 39 } 40 for ( j = i-1; j >= 1; j--) 41 { 42 range[j][y] = 'S'; 43 if (pieces[j][y] != 'A' && pieces[j][y] != 'B') break; 44 } 45 for (i = x + 1; i <= 10; i++) 46 { 47 if (pieces[i][y] == 'B') return; 48 if (pieces[i][y] != 'A') break; 49 } 50 for (j = i + 1; j <= 10; j++) 51 { 52 range[j][y] = 'S'; 53 if (pieces[j][y] != 'A' && pieces[j][y] != 'B') break; 54 } 55 56 for (i = y-1; i >= 1; i--) 57 { 58 if (pieces[x][i] == 'B') return; 59 if (pieces[x][i] != 'A') break; 60 } 61 for ( j = i-1; j >= 1; j--) 62 { 63 range[x][j] = 'S'; 64 if (pieces[x][j] != 'A' && pieces[x][j] != 'B') break; 65 } 66 for (i = y + 1; i <= 9; i++) 67 { 68 if (pieces[x][i] == 'B') return; 69 if (pieces[x][i] != 'A') break; 70 } 71 for (j = i + 1; j <= 9; j++) 72 { 73 range[x][j] = 'S'; 74 if (pieces[x][j] != 'A' && pieces[x][j] != 'B') break; 75 } 76 } 77 void H(int x, int y) 78 { 79 if (y + 2 <= 9 && x - 1 >= 1 && pieces[x][y + 1] == 'A') range[x - 1][y + 2] = 'S'; 80 if (y + 2 <= 9 && x + 1 <= 10 && pieces[x][y + 1] == 'A') range[x + 1][y + 2] = 'S'; 81 if (y - 2 >= 1 && x - 1 >= 1 && pieces[x][y - 1] == 'A') range[x - 1][y - 2] = 'S'; 82 if (y - 2 >= 1 && x + 1 <= 10 && pieces[x][y - 1] == 'A') range[x + 1][y - 2] = 'S'; 83 if (x + 2 <= 10 && y - 1 >= 1 && pieces[x + 1][y] == 'A') range[x + 2][y - 1] = 'S'; 84 if (x + 2 <= 10 && y + 1 <= 9 && pieces[x + 1][y] == 'A') range[x + 2][y + 1] = 'S'; 85 if (x - 2 >= 1 && y - 1 >= 1 && pieces[x - 1][y] == 'A') range[x - 2][y - 1] = 'S'; 86 if (x - 2 >= 1 && y + 1 <= 9 && pieces[x - 1][y] == 'A') range[x - 2][y + 1] = 'S'; 87 } 88 int judge(int x, int y) 89 { 90 int is_secure = 0; 91 if (x + 1 <= 3 && range[x + 1][y] != 'S') is_secure = 1; 92 if (x - 1 >= 1 && range[x - 1][y] != 'S') is_secure = 1; 93 if (y + 1 <= 6 && range[x][y + 1] != 'S') is_secure = 1; 94 if (y - 1 >= 4 && range[x][y - 1] != 'S') is_secure = 1; 95 return is_secure; 96 } 97 98 int main() 99 { 100 int n, r, c; 101 while (scanf("%d%d%d",&n,&r,&c) == 3 && n) 102 { 103 char ch[2]; 104 int r1, c1; 105 memset(pieces, 'A', sizeof(pieces)); 106 memset(range, 'A', sizeof(range)); 107 memset(pos, 0, sizeof(pos)); 108 pieces[r][c] = 'B'; 109 for (int i = 0; i < n; i++) 110 { 111 scanf("%s", ch); 112 scanf("%d%d", &r1, &c1); 113 pieces[r1][c1] = ch[0]; 114 pos[i][0] = r1; 115 pos[i][1] = c1; 116 } 117 for (int i = 0; i < n; i++) 118 { 119 int a = pos[i][0], b = pos[i][1]; 120 if (pieces[a][b] == 'R' || pieces[a][b] == 'G') RG(a, b); 121 else if (pieces[a][b] == 'H') H(a, b); 122 else if (pieces[a][b] == 'C') C(a, b); 123 } 124 if (!judge(r, c)) 125 printf("YES "); 126 else 127 printf("NO "); 128 } 129 return 0; 130 }
代码写得比较长,感觉很多地方可以写成循环的形式,但现在的水平感觉不好写,哈哈,以后记得再补!