HDU 4121
43796 ワード
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 }