http://www.bnuoj.com/v3/problem_show.php?pid=10277
1 //#pragma comment(linker, "/STACK:16777216") //for c++ Compiler 2 #include <stdio.h> 3 #include <iostream> 4 #include <climits> 5 #include <cstring> 6 #include <cmath> 7 #include <stack> 8 #include <vector> 9 #include <algorithm> 10 #define ll long long 11 using namespace std; 12 13 const int INF = 0x3f3f3f3f; 14 const int MAXN = 1001; 15 const int row = 10; 16 const int col = 9; 17 18 int map[20][20]; 19 int G_x, G_y, pos_x, pos_y; 20 bool ans; 21 22 bool deal(int x, int y){ 23 return (x >= 1 && x <= row && y >= 1 && y <= col); 24 } 25 26 bool deal_plus(int x, int y){ 27 if(deal(x, y) && x <= 3 && y >= 4 && y <= 6) return true; 28 return false; 29 } 30 31 void init(){ 32 ans = false; 33 memset(map, 0, sizeof(map)); 34 } 35 36 bool shuai(int x, int y){ 37 int i, j; 38 if(x - 1 < pos_x) return false; 39 for(i = x - 1; i >= pos_x; --i){ 40 if(map[i][y]) break; 41 } 42 if(map[i][y] == 5) return true; 43 return false; 44 } 45 46 bool ju(int x, int y){ 47 int i, j; 48 for(i = x + 1; i <= pos_x; ++i){ 49 if(x + 1 > pos_x) break; 50 if(map[i][y]){ 51 if(map[i][y] == 5) return true; 52 else break; 53 } 54 } 55 for(i = x - 1; i >= 1; --i){ 56 if(x - 1 < 1) break; 57 if(map[i][y]){ 58 if(map[i][y] == 5) return true; 59 else break; 60 } 61 } 62 for(j = y - 1; j >= 1; --j){ 63 if(y - 1 < 1) break; 64 if(map[x][j]){ 65 if(map[x][j] == 5) return true; 66 else break; 67 } 68 } 69 for(j = y + 1; j <= col; ++j){ 70 if(y + 1 > col) break; 71 if(map[x][j]){ 72 if(map[x][j] == 5) return true; 73 else break; 74 } 75 } 76 return false; 77 } 78 79 bool pao(int x, int y){ 80 bool flag = false; 81 int i, j; 82 for(i = x + 1; i <= pos_x; ++i){ 83 if(x + 1 > pos_x) break; 84 if(flag){ 85 if(map[i][y] == 5 ) return true; 86 else break; 87 } else if(map[i][y]){ 88 flag = true; 89 } 90 } 91 flag = false; 92 for(i = x - 1; i >= 1; --i){ 93 if(x - 1 < 1) break; 94 if(flag){ 95 if(map[i][y] == 5) return true; 96 else break; 97 } else if(map[i][y]){ 98 flag = true; 99 } 100 } 101 flag = false; 102 for(j = y - 1; j >= 1; --j){ 103 if(y - 1 < 1) break; 104 if(flag){ 105 if(map[x][j] == 5) return true; 106 else break; 107 } else if(map[x][j]){ 108 flag = true; 109 } 110 } 111 flag = false; 112 for(j = y + 1; j <= col; ++j){ 113 if(y + 1 > col) break; 114 if(flag){ 115 if(map[x][j] == 5) return true; 116 else break; 117 } else if(map[x][j]){ 118 flag = true; 119 } 120 } 121 return false; 122 } 123 124 bool ma(int x, int y){ 125 int xx, yy; 126 127 xx = x + 2; yy = y - 1; 128 if(xx == pos_x && yy == pos_y && map[x + 1][y] == 0) return true; 129 130 xx = x + 2; yy = y + 1; 131 if(xx == pos_x && yy == pos_y && map[x + 1][y] == 0) return true; 132 133 xx = x + 1; yy = y + 2; 134 if(xx == pos_x && yy == pos_y && map[x][y + 1] == 0) return true; 135 136 xx = x - 1; yy = y + 2; 137 if(xx == pos_x && yy == pos_y && map[x][y + 1] == 0) return true; 138 139 xx = x - 2; yy = y + 1; 140 if(xx == pos_x && yy == pos_y && map[x - 1][y] == 0) return true; 141 142 xx = x - 2; yy = y - 1; 143 if(xx == pos_x && yy == pos_y && map[x - 1][y] == 0) return true; 144 145 xx = x - 1; yy = y - 2; 146 if(xx == pos_x && yy == pos_y && map[x][y - 1] == 0) return true; 147 148 xx = x + 1; yy = y - 2; 149 if(xx == pos_x && yy == pos_y && map[x][y - 1] == 0) return true; 150 151 return false; 152 } 153 154 bool beat(int x, int y){ 155 int i, j; 156 if(x + 1 > row) return false; 157 for(i = x + 1; i <= row; ++i){ 158 if(map[i][y]) break; 159 } 160 if(map[i][y] == 1) return true; 161 return false; 162 } 163 164 bool solve(){ 165 int i, j; 166 for(i = 1; i <= row; ++i){ 167 for(j = 1; j <= col; ++j){ 168 if(map[i][j] == 1) 169 if(shuai(i, j)) return true; 170 if(map[i][j] == 2) 171 if(ju(i, j)) return true; 172 if(map[i][j] == 3) 173 if(pao(i, j)) return true; 174 if(map[i][j] == 4) 175 if(ma(i, j)) return true; 176 } 177 } 178 return false; 179 } 180 181 int main(){ 182 int i, j, t; 183 char cc; 184 while(cin >> t >> G_x >> G_y){ 185 if(t == 0 && G_x == 0 && G_y == 0) break; 186 init(); 187 map[G_x][G_y] = 5; 188 while(t--){ 189 cin >> cc >> pos_x >> pos_y; 190 if(cc == 'G'){ 191 map[pos_x][pos_y] = 1; 192 } else if(cc == 'R'){ 193 map[pos_x][pos_y] = 2; 194 } else if(cc == 'C'){ 195 map[pos_x][pos_y] = 3; 196 } else if(cc == 'H'){ 197 map[pos_x][pos_y] = 4; 198 } 199 } 200 if(beat(G_x, G_y)){ 201 ans = false; 202 } 203 else{ 204 if(deal_plus(G_x - 1, G_y)){ 205 map[G_x][G_y] = 0; 206 int temp_num = map[G_x - 1][G_y]; 207 map[G_x - 1][G_y] = 5; 208 pos_x = G_x - 1; 209 pos_y = G_y; 210 211 if(solve()){ 212 ans = true; 213 } 214 else{ 215 printf("NO "); 216 continue; 217 } 218 map[G_x - 1][G_y] = temp_num; 219 map[G_x][G_y] = 5; 220 } 221 if(deal_plus(G_x + 1, G_y)){ 222 map[G_x][G_y] = 0; 223 int temp_num = map[G_x + 1][G_y]; 224 map[G_x + 1][G_y] = 5; 225 pos_x = G_x + 1; 226 pos_y = G_y; 227 228 if(solve()){ 229 ans = true; 230 } 231 else{ 232 printf("NO "); 233 continue; 234 } 235 map[G_x + 1][G_y] = temp_num; 236 map[G_x][G_y] = 5; 237 } 238 if(deal_plus(G_x, G_y - 1)){ 239 map[G_x][G_y] = 0; 240 int temp_num = map[G_x][G_y - 1]; 241 map[G_x][G_y - 1] = 5; 242 pos_x = G_x; 243 pos_y = G_y - 1; 244 245 if(solve()){ 246 ans = true; 247 } 248 else{ 249 printf("NO "); 250 continue; 251 } 252 map[G_x][G_y - 1] = temp_num; 253 map[G_x][G_y] = 5; 254 } 255 if(deal_plus(G_x, G_y + 1)){ 256 map[G_x][G_y] = 0; 257 int temp_num = map[G_x][G_y + 1]; 258 map[G_x][G_y + 1] = 5; 259 pos_x = G_x; 260 pos_y = G_y + 1; 261 262 if(solve()){ 263 ans = true; 264 } 265 else{ 266 printf("NO "); 267 continue; 268 } 269 map[G_x][G_y + 1] = temp_num; 270 map[G_x][G_y] = 5; 271 } 272 } 273 if(ans){ 274 printf("YES "); 275 } else{ 276 printf("NO "); 277 } 278 } 279 return 0; 280 }