• HDU 4121 Xiangqi (算是模拟吧)


    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4121

    题意:中国象棋对决,黑棋只有一个将,红棋有一个帅和不定个车 马 炮冰给定位置,这时当黑棋走,问你黑棋是不是被将死了(当前位置被将,能走得下一步也被将)

    题解:代码里面注释很详细,我就不多说了,知道象棋规则的同学基本上都可以做出来

    AC代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <string>
    #include <cstdlib>
    #include <cmath>
    #include <vector>
    #include <list>
    #include <deque>
    #include <queue>
    #include <iterator>
    #include <stack>
    #include <map>
    #include <set>
    #include <algorithm>
    #include <cctype>
    using namespace std;
    
    #define si1(a) scanf("%d",&a)
    #define si2(a,b) scanf("%d%d",&a,&b)
    #define sd1(a) scanf("%lf",&a)
    #define sd2(a,b) scanf("%lf%lf",&a,&b)
    #define ss1(s)  scanf("%s",s)
    #define pi1(a)    printf("%d
    ",a)
    #define pi2(a,b)  printf("%d %d
    ",a,b)
    #define mset(a,b)   memset(a,b,sizeof(a))
    #define forb(i,a,b)   for(int i=a;i<b;i++)
    #define ford(i,a,b)   for(int i=a;i<=b;i++)
    
    typedef long long LL;
    const int N=110001;
    const int M=1000007;
    const int INF=0x3f3f3f3f;
    const double PI=acos(-1.0);
    const double eps=1e-7;
    
    char mp[11][11];
    int bx,by,n;
    int tt[4][2]={1,0,-1,0,0,1,0,-1};
    
    struct node
    {
        int x,y;
    }pp[11];
    
    bool shu(int x1,int x2,int y)
    {
        if(x1>x2)   swap(x1,x2);
        int f=0;
        for(int i=x1+1;i<x2;i++)
            if(mp[i][y]!='0')
                f=1;
        if(f)   return false;
        else    return true;
    }
    
    bool heng(int x,int y1,int y2)
    {
        if(y1>y2)   swap(y1,y2);
        int f=0;
        for(int j=y1+1;j<y2;j++)
            if(mp[x][j]!='0')
                f=1;
        if(f)   return false;
        else    return true;
    }
    
    bool shuone(int x1,int x2,int y)
    {
        if(x1>x2)   swap(x1,x2);
        int f=0;
        for(int i=x1+1;i<x2;i++)
            if(mp[i][y]!='0')
                f++;
        if(f!=1)   return false;
        else    return true;
    }
    
    bool hengone(int x,int y1,int y2)
    {
        if(y1>y2)   swap(y1,y2);
        int f=0;
        for(int j=y1+1;j<y2;j++)
            if(mp[x][j]!='0')
                f++;
        if(f!=1)   return false;
        else    return true;
    }
    
    bool jiang(int x,int y)
    {
        forb(i,0,n)
        {
            int rx=pp[i].x,ry=pp[i].y;
            char c=mp[rx][ry];
            if(c=='G')//对将的时候,判断在一列且中间没有棋子
            {
                if(ry==y&&shu(x,rx,y))  return true;
            }
            if(c=='R')//车,判断在一行一列且中间没有棋子
            {
                if(x==rx&&heng(x,y,ry)) return true;
                if(y==ry&&shu(x,rx,y))  return true;
            }
            if(c=='H')//马,判断距离为3,且没有被撇马腿
            {
                if((abs(x-rx)+abs(y-ry))!=3)    continue;
                if(abs(x-rx)==2)
                {
                    if(rx<x&&mp[rx+1][ry]=='0')   return true;
                    if(rx>x&&mp[rx-1][ry]=='0')   return true;
                }
                if(abs(y-ry)==2)
                {
                    if(ry<y&&mp[rx][ry+1]=='0') return true;
                    if(ry>y&&mp[rx][ry-1]=='0') return true;
                }
            }
            if(c=='C')//炮,判断在一行一列且中间只有一个棋子
            {
                if(x==rx&&hengone(x,y,ry)) return true;
                if(y==ry&&shuone(x,rx,y))  return true;
            }
        }
        return false;
    }
    
    int main()
    {
        while(scanf("%d%d%d",&n,&bx,&by)&&(n+bx+by)!=0)
        {
            memset(mp,'0',sizeof(mp));
            char c;
            int x,y;
            forb(i,0,n)
            {
                cin>>c>>x>>y;
                mp[x][y]=c;
                pp[i].x=x;  pp[i].y=y;
            }
    
            if(!jiang(bx,by))//如果开始的时候都不将军则直接输出no
            {
                printf("NO
    ");
                continue;
            }
            int flag=0;
            forb(i,0,4)//可以向四个方向走
            {
                x=bx+tt[i][0];
                y=by+tt[i][1];
                if(x>=1&&x<=3&&y>=4&&y<=6)//注意范围
                {
                    char c=mp[x][y];//这个地方要注意,如果有棋子的话可以吃,开始的时候我认为有棋子的地方不能走
                    mp[x][y]='0';
                    if(!jiang(x,y))//判断能不能将军
                    {
                        flag=1;
                        break;
                    }
                    mp[x][y]=c;//还原
                }
            }
            printf("%s
    ",flag?"NO":"YES");
        }
        return 0;
    }
    


     

  • 相关阅读:
    Echars折线配置详解
    Echarts中太阳图(Sunburst)的实例
    MongoDB shell 介绍
    js深度克隆对象
    js将有父子关系的数据转换成树形结构数据
    使用Mongoose类库实现简单的增删改查
    MongoDB可视化工具--Robo 3T 使用教程
    go语言之进阶篇并行和并发的区别与go语言并发优势
    go语言之进阶篇拷贝文件案例
    go语言之进阶篇借助bufio实现按行读取内容
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3339653.html
Copyright © 2020-2023  润新知