uva 1589 - Xiangqi
2014-07-21 17:03
405 查看
把所有红方的攻击范围标记出来,判断黑方四个方向是否在红方范围内 #include <iostream> #include <cstdio> #include <vector> #include <cstring> #include <cstring> #include <cctype> #include <algorithm> #include <cmath> #include <cstdlib> #define maxn 100 + 10 #define INF 0x7fffffff using namespace std; struct NODE { char ch[3]; int x, y; }a[10]; int g[20][20]; bool vis[20][20]; bool inxy(int x, int y) { if(x <= 10 && x >= 1 && y <= 9 && y >= 1) return true; return false; } bool inc(int x, int y) { if(x >= 1 && x <= 3 && y >= 4 && y <= 6) return true; return false; } void check_G(int x, int y) { for(int i = x-1; i >= 1; --i) { if(g[i][y]) {vis[i][y] = true; break;} vis[i][y] = true; } return; } void check_R(int x, int y) { for(int i = y+1; i <= 9; ++i)//right { if(g[x][i]) {vis[x][i] = true; break;} vis[x][i] = true; } for(int i = y-1; i >= 1; --i)//left { if(g[x][i]) {vis[x][i] = true; break;} vis[x][i] = true; } for(int i = x-1; i >= 1; --i)//up { if(g[i][y]) {vis[i][y] = true; break;} vis[i][y] = true; } for(int i = x+1; i <= 10; ++i)//down { if(g[i][y]) {vis[i][y] = true; break;} vis[i][y] = true; } return; } void check_H(int x, int y) { if(!g[x-1][y]) {//up int dx = x-2; int dy = y-1; if(inxy(dx, dy)) vis[dx][dy] = true; dy = y+1; if(inxy(dx, dy)) vis[dx][dy] = true; } //down if(!g[x+1][y]){ int dx = x+2; int dy = y-1; if(inxy(dx, dy)) vis[dx][dy] = true; dy = y+1; if(inxy(dx, dy)) vis[dx][dy] = true; } if(!g[x][y+1]) {//right int dx = x+1; int dy = y+2; if(inxy(dx, dy)) vis[dx][dy] = true; dx = x-1; if(inxy(dx, dy)) vis[dx][dy] = true; } if(!g[x][y-1]) {//left int dx = x-1; int dy = y-2; if(inxy(dx, dy)) vis[dx][dy] = true; dx = x+1; if(inxy(dx, dy)) vis[dx][dy] = true; } return; } void check_C(int x, int y) { for(int i = x-1; i >= 1; --i)//up { if(g[i][y]){ for(int j = i-1; j >= 1; --j) { if(g[j][y]) {vis[i][y] = true; break;} vis[j][y] = true; } break; } } for(int i = x+1; i <= 10; ++i)//down { if(g[i][y]){ for(int j = i+1; j <= 10; ++j) { if(g[j][y]) {vis[j][y] = true; break;} vis[j][y] = true; } break; } } for(int i = y-1; i >= 1; --i)//left { if(g[x][i]){ for(int j = i-1; j >= 1; --j) { if(g[x][j]) {vis[x][j] = true; break;} vis[x][j] = true; } break; } } for(int i = y+1; i <= 9; ++i)//right { if(g[x][i]){ for(int j = i+1; j <= 9; ++j) { if(g[x][j]) {vis[x][j] = true; break;} vis[x][j] = true; } break; } } return; } bool ok(int x, int y) { int dx = x+1; int dy = y; if(inc(dx, dy) && !vis[dx][dy])//down return true; dx = x-1; if(inc(dx, dy) && !vis[dx][dy])//up return true; dx = x; dy = y-1; if(inc(dx, dy) && !vis[dx][dy])//left return true; dy = y+1; if(inc(dx, dy) && !vis[dx][dy])//right return true; return false; } int main() { int n, x, y, z; while(scanf("%d%d%d", &n, &x, &y) != EOF) { if(!n && !x && !y) break; memset(vis, false, sizeof(vis)); memset(g, 0, sizeof(g)); for(int i = 0; i < n; ++i) { scanf("%s%d%d", a[i].ch, &a[i].x, &a[i].y); g[a[i].x][a[i].y] = 1; } for(int i = 0; i < n; ++i) { if(a[i].ch[0] == 'G') check_G(a[i].x, a[i].y); else if(a[i].ch[0] == 'R') check_R(a[i].x, a[i].y); else if(a[i].ch[0] == 'C') check_C(a[i].x, a[i].y); else if(a[i].ch[0] == 'H') check_H(a[i].x, a[i].y); } if(ok(x, y)) puts("NO"); else puts("YES"); } return 0; }
相关文章推荐
- 紫书章四习题一 xiangqi uva 1589(模拟)
- Uva 1589 Xiangqi
- Uva 1589 Xiangqi 判断是否将死
- UVA1589——xiangqi
- ●UVa 1589 Xiangqi(模拟)
- 紫书章四习题一 xiangqi uva 1589(模拟)
- UVA 1589 Xiangqi
- UVA 1589:Xiangqi (模拟 Grade D)
- UVA1589——xiangqi
- UVa 1589 Xiangqi
- 紫书章四习题一 xiangqi uva 1589(模拟)
- (模拟) uva 1589 Xiangqi
- UVa 1589 - Xiangqi
- Xiangqi UVA - 1589
- hdu4121 Xiangqi && uva1589 Xiangqi (模拟)
- UVA - 1589 Xiangqi
- 紫书章四习题一 xiangqi uva 1589(模拟)
- uva 1589 Xiangqi 模拟题
- [刷题]算法竞赛入门经典(第2版) 4-1/UVa1589 - Xiangqi
- UVA - 1589 Xiangqi (模拟)