【UVa1589】象棋

分享一下我的思路吧
先判断初始局面是不是老将脸对脸,如果是的话,黑方获胜,输出NO
如果不是,黑方老将最多只有走下一步的方式,判断一下走完之后是否仍被将军,是就输出YES,否就输出N
判断黑方老将是否被将军时,车炮红将的判断方法十分嘞,都是横和竖,具体条件不太一样罢了,所以很好写,判断马时,就是八个位置,八种情况

#include <stdio.h>
#include <string.h>
int Kill(char XQ[11][10], int a, int b)
{//判断走一步之后的黑方是否被将军
    char ch;
    for(int i = 1; i <= 10; i++)
    {
        for(int j = 1; j <= 9; j++)
        {
            ch = XQ[i][j];
            if(ch == 'R' || ch == 'G')
            {//车或将
                int a0 = a, b0 = b, mark = 1;
                if(a0 == i)
                {//车与黑帅在同一行
                    if(b0 > j)//黑帅在右
                    {
                        --b0;
                        for(;b0 > j; b0--)
                        {
                            if(XQ[a0][b0] != 'A')  {mark = 0; break;}
                        }
                    }
                    if(b > j && mark)  return 1;
                    if(b0 < j)//黑帅在左
                    {
                        ++b0;
                        for(; b0 < j; b0++)
                        {
                            if(XQ[a0][b0] != 'A')  {mark = 0; break;}
                        }
                    }
                    if(b < j && mark)  return 1;
                }
                if(b0 == j)
                {//车与黑帅在同一列
                    if(a0 > i)//黑帅在下
                    {
                        --a0;
                        for(;a0 > i; a0--)
                        {
                            if(XQ[a0][b0] != 'A')  {mark = 0; break;}
                        }
                    }
                    if(a > i && mark)  return 1;
                    if(a0 < i)//黑帅在上
                    {
                        ++a0;
                        for(; a0 < i; a0++)
                        {
                            if(XQ[a0][b0] != 'A')  {mark = 0; break;}
                        }
                    }
                    if(a < i && mark)  return 1;
                }
            }
            else if(ch == 'C')
            {//炮
                int a0 = a, b0 = b, count = 0;
                if(a0 == i)
                {//炮与黑帅在同一行
                    if(b0 > j)//黑帅在右
                    {
                        --b0;
                        for(;b0 > j; b0--)
                            if(XQ[a0][b0] != 'A')  count++;
                    }
                    if(b > j && count == 1)  return 1;
                    if(b0 < j)//黑帅在左
                    {
                        ++b0;
                        for(; b0 < j; b0++)
                            if(XQ[a0][b0] != 'A')  count++;
                    }
                    if(b < j && count == 1)  return 1;
                }
                if(b0 == j)
                {//炮与黑帅在同一列
                    if(a0 > i)//黑帅在下
                    {
                        --a0;
                        for(;a0 > i; a0--)
                            if(XQ[a0][b0] != 'A')  count++;
                    }
                    if(a > i && count == 1)  return 1;
                    if(a0 < i)//黑帅在上
                    {
                        ++a0;
                        for(; a0 < i; a0++)
                            if(XQ[a0][b0] != 'A')  count++;
                    }
                    if(a < i && count == 1)  return 1;
                }
            }
            else if(ch == 'H')
            {//马
                if(i-1 == a && j+2 == b && XQ[i][j+1] == 'A')  return 1;
                if(i-2 == a && j+1 == b && XQ[i-1][j] == 'A')  return 1;
                if(i+1 == a && j+2 == b && XQ[i][j+1] == 'A')  return 1;
                if(i+2 == a && j+1 == b && XQ[i+1][j] == 'A')  return 1;
                if(i-2 == a && j-1 == b && XQ[i-1][j] == 'A')  return 1;
                if(i-1 == a && j-2 == b && XQ[i][j-1] == 'A')  return 1;
                if(i+1 == a && j-2 == b && XQ[i][j-1] == 'A')  return 1;
                if(i+2 == a && j-1 == b && XQ[i+1][j] == 'A')  return 1;
            }
        }
    }
    return 0;
}
int main()
{
    int num, x, y, x1, y1;
    char XQ[11][10];
    START:while(scanf("%d%d%d", &num, &x, &y) == 3 && num)
    {
        getchar();
        memset(XQ, 'A', sizeof(XQ));
        while(num--)
        {
            char r_piece;
            int r_x, r_y;
            scanf("%c%d%d", &r_piece, &r_x, &r_y);
            if(r_piece == 'G')  {x1 = r_x;  y1 = r_y;}
            XQ[r_x][r_y] = r_piece;
            getchar();
        }
        int kill = 0;
        if(y1 == y)
        {//别忽略黑帅的决胜能力,如果初始局面是老将对脸,则黑方胜利
            int x0 = x+1, flag = 0;
            for(; x0 < x1; x0++)
                if(XQ[x0][y] != 'A')  flag = 1;
            if(!flag)
            {
                printf("NO\n");
                goto START;
            }
        }
        //黑方只有四种移动的可能,移动之后判断是否仍被将军即可
        if(x - 1 >= 1)
        {
            XQ[x-1][y] = 'X';
            if(!Kill(XQ, x-1, y))  {printf("NO\n");  goto START;}
            else  {XQ[x-1][y] = 'A';  kill = 1;}
        }
        if(x + 1 <= 3)
        {
            XQ[x+1][y] = 'X';
            if(!Kill(XQ, x+1, y))  {printf("NO\n");  goto START;}
            else  {XQ[x+1][y] = 'A';   kill = 1;}
        }
        if(y - 1 >= 4)
        {
            XQ[x][y-1] = 'X';
            if(!Kill(XQ, x, y-1))  {printf("NO\n");  goto START;}
            else  {XQ[x][y-1] = 'A';  kill = 1;}
        }
        if(y + 1 <= 6)
        {
            XQ[x][y+1] = 'X';
            if(!Kill(XQ, x, y+1))  {printf("NO\n");  goto START;}
            else  {XQ[x][y+1] = 'A';  kill =1;}
        }
        if(kill)  printf("YES\n");
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值