HDU 4121

博客提供了一个题目链接 http://www.bnuoj.com/v3/problem_show.php?pid=10277,同时给出了转载来源链接 https://www.cnblogs.com/wushuaiyi/p/3900156.html。

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\n");
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\n");
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\n");
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\n");
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\n");
275         } else{
276             printf("NO\n");
277         }
278     }
279     return 0;
280 }

 

转载于:https://www.cnblogs.com/wushuaiyi/p/3900156.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值