纯模拟题,判断走4个方向,判断是不是能够被将死
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<map> #include<vector> #include<stack> #include<queue> #include<set> #include<list> #include<cmath> using namespace std; typedef long long LL; #define ALL(x) x.begin(),x.end() char Map[15][15]; int start_x,start_y,n; const int range_x1 = 1 ,range_x2 = 3; const int range_y1 = 4 ,range_y2 = 6; int dir[4][2] = {{-1,0},{1,0},{0,-1},{0,1}}; void display(){ printf("================\n"); for(int i = 1; i <= 10 ; i++){ for(int j = 1; j <= 9 ; j++) printf("%c",Map[i][j]); printf("\n"); } printf("================\n"); } int _G(int x,int y,int a,int b){ if(y != b) return 1; /*返回1说明没被吃掉*/ for(int i = x - 1; i >= 1 ; i --) if(i == a) return 0; /*返回0说明被吃掉了*/ else if(Map[i][y] != '.') return 1; } int _C(int x,int y,int a,int b){ if(x != a && y != b) return 1; /*不在一行一列肯定不行*/ int _count = 0; if(x == a){ /*在一条横向上*/ int pos_s = min(b,y); int pos_e = max(b,y); for(int i = pos_s + 1; i < pos_e ; i++) if(Map[a][i] != '.') _count ++; } else if(y == b){ /*在一条竖线上*/ int pos_s = min(a,x); int pos_e = max(a,x); for(int i = pos_s + 1; i < pos_e ; i++) if(Map[i][b] != '.') _count ++; } if(_count == 1) return 0; else return 1; } int _H(int x,int y,int a,int b){ /*上*/ if(x - 1 >= 1){ if(Map[x - 1][y] == '.'){ if(x - 2 >= 1 && y - 1 >= 1){ if(x - 2 == a && y - 1 == b) return 0; } if(x - 2 >= 1 && y + 1 <= 9){ if(x - 2 == a && y + 1 == b) return 0; } } } /*下*/ if(x + 1 <= 10){ if(Map[x + 1][y] == '.'){ if(x + 2 <= 10 && y - 1 >= 1){ if(x + 2 == a && y - 1 == b) return 0; } if(x + 2 <= 10 && y + 1 <= 9){ if(x + 2 == a && y + 1 == b) return 0; } } } /*左*/ if(y - 1 >= 0){ if(Map[x][y - 1] == '.'){ if(x - 1 >= 1 && y - 2 >= 1){ if(x - 1 == a && y - 2 == b) return 0; } if(x + 1 <= 10 && y - 2 >= 1){ if(x + 1 == a && y - 2 == b) return 0; } } } /*右*/ if(y + 1 <= 9){ if(Map[x][y + 1] == '.'){ if(Map[x][y - 1] == '.'){ if(x - 1 >= 1 && y + 2 <= 9){ if(x - 1 == a && y + 2 == b) return 0; } if(x + 1 <= 10 && y + 2 <= 9){ if(x + 1 == a && y + 2 == b) return 0; } } } } return 1; } int _R(int x,int y,int a,int b){ if(x != a && y != b) return 1; /*不在一行一列肯定不行*/ int _count = 0; if(x == a){ /*在一条横向上*/ int pos_s = min(b,y); int pos_e = max(b,y); for(int i = pos_s + 1; i < pos_e ; i++) if(Map[a][i] != '.') _count ++; } else if(y == b){ /*在一条竖线上*/ int pos_s = min(a,x); int pos_e = max(a,x); for(int i = pos_s + 1; i < pos_e ; i++) if(Map[i][b] != '.') _count ++; } if(_count == 0) return 0; else return 1; } int _solve(int xx,int yy){ int ok = 1; for(int i = 1 ; i <= 10 ; i++) for(int j = 1 ; j <= 9 ; j++){ if(Map[i][j] == 'G'){ ok = _G(i,j,xx,yy); } else if(Map[i][j] == 'C')ok = _C(i,j,xx,yy); else if(Map[i][j] == 'R')ok = _R(i,j,xx,yy); else if(Map[i][j] == 'H')ok = _H(i,j,xx,yy); if(ok == 0) /*所有棋子中,只要有一个棋子能吃到他就无法走*/ return 0; } return 1; } int solve(){ /*走4个方向*/ int ok ; for(int i = 0 ; i < 4 ; i ++){ int now_x = start_x + dir[i][0]; int now_y = start_y + dir[i][1]; if(now_x >= range_x1 && now_x <= range_x2 && now_y >= range_y1 && now_y <= range_y2){ char temp = Map[now_x][now_y]; Map[now_x][now_y] = '.'; int ok = _solve(now_x,now_y); /*如果不能走为0,能走为1*/ Map[now_x][now_y] = temp; if(ok) return 0; /*返回0代表没有被将军*/ } } return 1; } int main(){ while(scanf("%d%d%d",&n,&start_x,&start_y)){ if(!start_x && !start_y && !n) break; memset(Map,'.',sizeof(Map)); for(int i = 0 ; i < n ; i ++){ char t[10]; int x,y; scanf("%s%d%d",t,&x,&y); Map[x][y] = t[0]; } int ok = solve(); if(ok) printf("YES\n"); /*被将军了*/ else printf("NO\n"); /*没有被将军*/ } return 0; }