POJ4001/HDU4121 Xiangqi 大模拟

来源:互联网 发布:java源码阅读工具 编辑:程序博客网 时间:2024/06/05 19:36

题目传送门: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;}
0 0
原创粉丝点击