今天跟人做这个,超级模拟,wa了七次……
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int ch_x[4] = {-1, 0, 1, 0};
const int ch_y[4] = {0, 1, 0, -1};
const int ho_x[8] = {-2, -2, -1, 1, 2, 2, 1, -1};
const int ho_y[8] = {-1, 1, 2, 2, 1, -1, -2, -2};
int board[20][20]; //1: red, 2: black
int blackGeneral_x, blackGeneral_y;
int total_red, red_x[10], red_y[10];
char kind[10];
int JudgeLine(int i, int x, int y)
{ //Count how many pieces there are between (red_x[i], red_y[i]) and (x, y)
int res = 0;
if(red_x[i] == x) {
if(red_y[i] < y) {
for(int j = red_y[i] + 1; j != y; j++) {
if(board[x][j] != 0)
res++;
}
}
else {
for(int j = red_y[i] - 1; j != y; j--) {
if(board[x][j] != 0)
res++;
}
}
return res;
}
else if(red_y[i] == y) {
if(red_x[i] < x) {
for(int j = red_x[i] + 1; j != x; j++) {
if(board[j][y] != 0)
res++;
}
}
else {
for(int j = red_x[i] - 1; j != x; j--) {
if(board[j][y] != 0)
res++;
}
}
return res;
}
return -1;
}
bool JudgeChariot(int i, int x, int y)
{ //chariot can eat black general
if(JudgeLine(i, x, y) == 0)
return true;
return false;
}
bool JudgeHorse(int i, int x, int y)
{ //whether horse can eat black general
for(int j = 0; j < 8; j++) {
int tmpx = red_x[i] + ho_x[j];
int tmpy = red_y[i] + ho_y[j];
int footx = red_x[i] + ch_x[j / 2];
int footy = red_y[i] + ch_y[j / 2];
if(tmpx < 1 || tmpx > 10 || tmpy < 1 || tmpy > 9)
continue;
if(footx < 1 || footx > 10 || footy < 1 || footy > 9)
continue;
if(board[footx][footy] != 0)
continue;
if(tmpx == x && tmpy == y)
return true;
}
return false;
}
bool JudgeCannon(int i, int x, int y)
{ //whether connon can eat black general
if(JudgeLine(i, x, y) == 1)
return true;
return false;
}
int main()
{
//freopen("data.in", "rb", stdin);
while(scanf("%d%d%d", &total_red, &blackGeneral_x, &blackGeneral_y) != EOF) {
if(!total_red && !blackGeneral_x && !blackGeneral_y)
break;
memset(board, 0, sizeof(board));
for(int i = 0; i < total_red; i++) {
char tmp;
cin >> tmp >> red_x[i] >> red_y[i];
kind[i] = tmp;
board[red_x[i]][red_y[i]] = 1;
}
bool isCheckmate = true;
for(int i = 0; i < 4; i++) {
int x = blackGeneral_x + ch_x[i];
int y = blackGeneral_y + ch_y[i];
if(!((x >= 1 && x <= 3 && y >= 4 && y <= 6) || (x >= 8 && x <= 10 && y >= 4 && y <= 6)))
continue;
int tmp = board[x][y];
board[x][y] = 2; //black general moves to this coodinate
bool win = false;
for(int j = 0; j < total_red; j++) {
if(board[red_x[j]][red_y[j]] != 1) //whether the piece of red has been eaten by black general
continue;
switch(kind[j]) {
case 'G': win = JudgeChariot(j, x, y); //red general can attack black general in the same way as chariot
break;
case 'R': win = JudgeChariot(j, x, y);
break;
case 'H': win = JudgeHorse(j, x, y);
break;
case 'C': win = JudgeCannon(j, x, y);
break;
}
if(win)
break;
}
if(!win) {
isCheckmate = false;
break;
}
board[x][y] = tmp;
}
if(isCheckmate)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}