POJ4001/HDU4121 Xiangqi 大模拟

题目传送门: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;
}
点赞