题目传送门:http://poj.org/problem?id=4001
这其实就是一道无脑模拟题。。首先黑方将有四个位置可以走(上下左右)(如果可以走的话),那么就分别模拟走到这四个位置,然后判断会不会被红方将军。如果被红方以任一方式将军则在这种情况下被将死。如果四种走位都会被将死,则输出YES,即黑方彻底玩完。一个我认为的Trick是如果一开始黑方还没走的时候就可以飞将红方,那么此时直接输出NO就好了(不用走,直接黑方赢了),测试样例应该是没有这样的样例的,不过我还是写上了,严谨一些。
真-Trick:
1、输入的时候用cin,输入里可能有乱七八糟的空格,用getchar()的话会出事
2、黑将走的时候不用考虑走的位置有没有红方的棋,因为如果有的话直接就相当于把它吃掉了,所以不用考虑有没有棋在那个格子里,直接走就是了。
3、注意马走的时候蹩马的情况,我一开始从黑方的视角判断那个蹩马的位置,看反了,WA了很久。应该从红方的视角来看。还是太不细心了,因此浪费了很多时间检查。
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
char Map[15][15];
bool ma(int x, int y)
{
//8种潜在被将可能
//1左上
if (x-1 >= 1 && y-2 >= 1 && Map[x-1][y-2] == 'H' && Map[x-1][y-1] == '0')
return true;
//2上左
if (x-2 >= 1 && y-1 >= 1 && Map[x-2][y-1] == 'H' && Map[x-1][y-1] == '0')
return true;
//3左下
if (x+1 <= 10 && y-2 >= 1 && Map[x+1][y-2] == 'H' && Map[x+1][y-1] == '0')
return true;
//4下左
if (x+2 <= 10 && y-1 >= 1 && Map[x+2][y-1] == 'H' && Map[x+1][y-1] == '0')
return true;
//5右上
if (x-1 >= 1 && y+2 <= 9 && Map[x-1][y+2] == 'H' && Map[x-1][y+1] == '0')
return true;
//6上右
if (x-2 >= 1 && y+1 <= 9 && Map[x-2][y+1] == 'H' && Map[x-1][y+1] == '0')
return true;
//7右下
if (x+1 <= 10 && y+2 <= 9 && Map[x+1][y+2] == 'H' && Map[x+1][y+1] == '0')
return true;
//8下右
if (x+2 <= 10 && y+1 <= 9 && Map[x+2][y+1] == 'H' && Map[x+1][y+1] == '0')
return true;
return false;
}
bool che(int x, int y)
{
//上
for (int i = x-1; i >= 1; i--)
{
if (Map[i][y] != '0')
{
if (Map[i][y] == 'R')
return true;
else
break;
}
}
//下
for (int i = x+1; i <= 10; i++)
{
if (Map[i][y] != '0')
{
if (Map[i][y] == 'R')
return true;
else
break;
}
}
//左
for (int j = y-1; j >= 1; j--)
{
if (Map[x][j] != '0')
{
if (Map[x][j] == 'R')
return true;
else
break;
}
}
//右
for (int j = y+1; j <= 9; j++)
{
if (Map[x][j] != '0')
{
if (Map[x][j] == 'R')
{
return true;
}
else
break;
}
}
return false;
}
bool pao(int x, int y)
{
//上
for (int i = x-1; i >= 1; i--)
{
if (Map[i][y] != '0')
{
for (int ii = i-1; ii >= 1; ii--)
{
if (Map[ii][y] != '0')
{
if (Map[ii][y] == 'C')
return true;
else
break;
}
}
break;
}
}
//下
for (int i = x+1; i <= 10; i++)
{
if (Map[i][y] != '0')
{
for (int ii = i+1; ii <= 10; ii++)
{
if (Map[ii][y] != '0')
{
if (Map[ii][y] == 'C')
return true;
else
break;
}
}
break;
}
}
//左
for (int j = y-1; j >= 1; j--)
{
if (Map[x][j] != '0')
{
for (int jj = j-1; jj >= 1; jj--)
{
if (Map[x][jj] != '0')
{
if (Map[x][jj] == 'C')
return true;
else
break;
}
}
break;
}
}
//右
for (int j = y+1; j <= 9; j++)
{
if (Map[x][j] != '0')
{
for (int jj = j+1; jj <= 9; jj++)
{
if (Map[x][jj] != '0')
{
if (Map[x][jj] == 'C')
return true;
else
break;
}
}
break;
}
}
return false;
}
bool fei(int x, int y)
{
for (int i = x+1; i <= 10; i++)
{
if (Map[i][y] != '0')
{
if (Map[i][y] == 'G')
return true;
else
return false;
}
}
return false;
}
int main()
{
int n,x,y,xx,yy;
char ch;
while (cin >> n >> x >> y)
{
if (n == 0 && x == 0 && y == 0) break;
for (int i = 1; i <= 10; i++)
{
for (int j = 1; j <= 9; j++)
{
Map[i][j] = '0';
}
}
// Map[x][y] = '*';
while (n--)
{
cin >> ch >> xx >> yy;
// putchar(ch);
// getchar();
Map[xx][yy] = ch;
}
bool ok1,ok2,ok3,ok4;
bool flag = false;//被将
bool first_win = false;
for (int i = x+1; i <= 10; i++)
{
if (Map[i][y] != '0')
{
if (Map[i][y] == 'G')
{
first_win = true;
}
break;
}
}
if (first_win)//黑方根本不用走直接以飞将的方式获胜
{
puts("NO");
continue;
}
if (x-1 >= 1)
{
xx = x - 1;
yy = y;
//马
ok1 = ma(xx,yy);//true代表会被将
//车
ok2 = che(xx,yy);
//跑
ok3 = pao(xx,yy);
//飞将
ok4 = fei(xx,yy);
if (!ok1 && !ok2 && !ok3 && !ok4)
{
flag = true;//可以存活
}
}
if (x+1 <= 3)
{
xx = x + 1;
yy = y;
//马
ok1 = ma(xx,yy);//true代表会被将
//车
ok2 = che(xx,yy);
//跑
ok3 = pao(xx,yy);
//飞将
ok4 = fei(xx,yy);
if (!ok1 && !ok2 && !ok3 && !ok4)
{
flag = true;//可以存活
}
}
if (y-1 >= 4)
{
xx = x;
yy = y - 1;
//马
ok1 = ma(xx,yy);//true代表会被将
//车
ok2 = che(xx,yy);
//跑
ok3 = pao(xx,yy);
//飞将
ok4 = fei(xx,yy);
if (!ok1 && !ok2 && !ok3 && !ok4)
{
flag = true;//可以存活
}
}
if (y+1 <= 6)
{
xx = x;
yy = y + 1;
//马
ok1 = ma(xx,yy);//true代表会被将
//车
ok2 = che(xx,yy);
//跑
ok3 = pao(xx,yy);
//飞将
ok4 = fei(xx,yy);
if (!ok1 && !ok2 && !ok3 && !ok4)
{
flag = true;//可以存活
}
}
if (!flag) puts("YES");
else puts("NO");
}
return 0;
}