hdu 1691 Chinese Chess

     一道很简单的模拟题,但是数据比较坑,应该是随机数据

    要注意:

      棋子不在自己的可能位置,将,士,相

详见代码:

#include <iostream>
#include <cstdio>
using namespace std;
int map[11][10];
int x[2],y[2];
int abs(int a){return a>0?a:-a;}
bool s(int x,int y,int xi,int xm,int yi,int ym)
{
    return (x<xi||x>xm||y<yi||y>ym);
}
bool legal(int f,int x1,int x2,int y1,int y2)// !f红,f黑
{
    if(x[0]<0||x[1]<0)return 0;//已将军
    if(s(x1,y1,1,10,1,9)||s(x2,y2,1,10,1,9))return 0;//越界
    if(x1==x2&&y1==y2)return 0;//不移动
    if(map[x1][y1]==0)return 0;//无子
    if( f&&(map[x1][y1]<8||map[x2][y2]>7))return 0;//控制别人棋或者吃自己
    if(!f&&(map[x1][y1]>7||(map[x2][y2]<8&&map[x2][y2]>0)))return 0;
    int mi,ma,i,t,t1,t2;
    switch(map[x1][y1])
    {
        case 1:case 8://帅
           if(!f&&(s(x1,y1,8,10,4,6)||s(x2,y2,8,10,4,6)))return 0;//九宫格
           if( f&&(s(x1,y1,1,3 ,4,6)||s(x2,y2,1,3 ,4,6)))return 0;
           if(abs(x1-x2)+abs(y1-y2)>1)return 0;
           x[f]=x2;y[f]=y2;
           break;
        case 2:case 9://士
          if(!f&&(s(x1,y1,8,10,4,6)||s(x2,y2,8,10,4,6)))return 0;
          if( f&&(s(x1,y1,1,3 ,4,6)||s(x2,y2,1,3 ,4,6)))return 0;
          if((abs(x1-x2)!=1||abs(y1-y2)!=1))return 0;//斜一格
          break;
        case 3:case 10://象
          t1=y1/2,t2=y2/2;//不在常规位置
          if((y1%2)==0||(y2%2)==0)return 0;
          if(f)
          {
              t1+=x1/2,t2+=x2/2;
              if((x1%2)==0||(x2%2)==0)return 0;
          }
          else
          {
              t1+=(11-x1)/2;t2+=(11-x2)/2;
              if((x1%2)||(x2%2))return 0;
          }
          if(t1%2==0||t2%2==0)return 0;
          if( f&&(x2>5||x1>5))return 0;
          if(!f&&(x2<6||x1<6))return 0;
          if(abs(x1-x2)!=2||abs(y1-y2)!=2)return 0;
          if(map[(x1+x2)>>1][(y1+y2)>>1])return 0;
          break;
        case 4:case 11://马
          if(abs(x1-x2)==1&&abs(y1-y2)==2)
          {
              if(map[x1][(y1+y2)>>1])return 0;
          }
          else if(abs(x1-x2)==2&&abs(y1-y2)==1)
          {
              if(map[(x1+x2)>>1][y1])return 0;
          }
          else return 0;
          break;
        case 5:case 12://车
          if(x1!=x2&&y1!=y2)return 0;
          if(x1==x2)
          {
            mi=min(y1,y2);ma=max(y1,y2);
            for(i=mi+1;i<ma&&map[x1][i]==0;i++);
            if(i!=ma)return 0;
          }
          else
          {
            mi=min(x2,x1);ma=max(x1,x2);
            for(i=mi+1;i<ma&&map[i][y1]==0;i++);
            if(i!=ma)return 0;
          }
          break;
        case 6:case 13://炮
          if(x1!=x2&&y1!=y2)return 0;
          if(x1==x2)
          {
            mi=min(y1,y2);ma=max(y1,y2);t=0;
            for(i=mi+1;i<ma;i++)
                if(map[x1][i]!=0)t++;
            if(t>1||(t==1&&map[x2][y2]==0)||(t==0&&map[x2][y2]))return 0;
          }
          else
          {
            mi=min(x2,x1);ma=max(x1,x2);t=0;
            for(i=mi+1;i<ma;i++)
               if(map[i][y1]!=0)t++;
            if(t>1||(t==1&&map[x2][y2]==0)||(t==0&&map[x2][y2]))return 0;
          }
          break;
        case 7:case 14://兵
          if(!f)
          {
              if(x1>5&&(x1-x2!=1||y1!=y2))return 0;
              if(x1<6&&(abs(x1-x2)+abs(y1-y2)!=1||x2>x1))return 0;
          }
          else
          {
              if(x1<6&&(x2-x1!=1||y1!=y2))return 0;
              if(x1>5&&(abs(x1-x2)+abs(y1-y2)!=1||x2<x1))return 0;
          }
          break;
    }
    if(map[x2][y2]==1)x[0]=-1;
    if(map[x2][y2]==8)x[1]=-1;
    map[x2][y2]=map[x1][y1];map[x1][y1]=0;
    if(x[0]==x[1])//王面对面
    {
        mi=min(y[0],y[1]);ma=max(y[0],y[1]);
        for(i=mi+1;i<ma&&map[x[0]][i]==0;i++);
        if(i==ma)return 0;
    }
    else if(y[0]==y[1])
    {
        mi=min(x[0],x[1]);ma=max(x[0],x[1]);
        for(i=mi+1;i<ma&&map[i][y[0]]==0;i++);
        if(i==ma)return 0;
    }
    return 1;
}
int main()
{
    int T,C=0;
    scanf("%d",&T);
    while(T--)
    {
        int i,j,f,m;
        for(i=1;i<=10;i++)
         for(j=1;j<=9;j++)
         {
          scanf("%d",&map[i][j]);
          if(map[i][j]==1)x[0]=i,y[0]=j;
          if(map[i][j]==8)x[1]=i,y[1]=j;
         }
        scanf("%d%d",&m,&f);
        int x1,y1,x2,y2,k,flag=0;
        for(k=1;k<=m;k++)
        {
            scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
            if(!flag&&!legal(f,x1,x2,y1,y2))flag=k;
            f=!f;
        }
        printf("Case %d: ",++C);
        if(flag)printf("Illegal move on step %d\n",flag);
        else printf("Legal move\n");
    }
}

    

时间: 2024-09-24 23:57:56

hdu 1691 Chinese Chess的相关文章

hdu 2842 Chinese Rings

点击打开hdu2842 思路: 矩阵快速幂 分析: 1 题目的意思是给定n个环,和一些规则要把所有的环全部拆下最少需要的步数 2 题目规定如果要拆第n个环,那么第n-1个要挂着,n-2环要被拆下.那么我们设f(n)表示拆下前n个环的最少的步骤    那么考虑第n个环的情况,第n-1个环必须要挂着,n-2环要拆下,那么这一步就要f(n-2),拆下第n个需要1步.然后只剩下第n-1个环,由于n-1环需要第n-2环挂着,所以我们需要把前n-2个环挂上去,所以需要f(n-2),剩下n-1个需要拆下需要f

【DP专辑】ACM动态规划总结

转载请注明出处,谢谢.   http://blog.csdn.net/cc_again?viewmode=list          ----------  Accagain  2014年5月15日 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间效率高,代码量少,多元性强,主要考察思维能力.建模抽象能力.灵活度. 本人动态规划博客地址:http://blog.csdn.net/cc_again/article/category/1261899 ******************

矩阵快速幂专题【完结】

第一题 hdu 1757 A Simple Math Problem 点击打开链接 思路:矩阵快速幂 分析: 1 最简单的矩阵快速幂的题目,直接利用矩阵求解即可 点击打开查看代码 第二题 hdu 1575 Tr A 点击打开hdu 1575 思路: 矩阵快速幂 分析: 1 题目给定一个n*n的矩阵要求矩阵的k次幂之后的矩阵的对角线的和 2 矩阵快速幂的裸题 点击打开查看代码 第三题 hdu 2604 Queuing 点击打开hdu 2604 思路: 递推+矩阵快速幂 分析; 1 根据题目的意思,

由JavaScript技术实现的web小游戏(不含网游)_javascript技巧

1.Mario(游戏地址:http://jsmario.com.ar/ ) 传说中的马里奥网页版,一比一实现了红白机时代超级马里奥中所有功能 与关卡,精细程度不逊原版游戏.依 赖库:无 2 . Bunny Hunt (游戏地址: http://www.themaninblue.com/experiment/BunnyHunt/) 猎兔,一款简单耐玩的网页狩猎游戏,没有使用第三方支持库,直接利用 css 与 JavasSript 实 现.   依 赖库:无   3 . Bomberman ( 游戏

linux的特殊符号与正则表达式

第1章 linux的特殊符号 1.1 通配符 * {} 1.1.1 含义 方便查找文件 通配符是用来找文件名字的. 1.1.2  * 通过find 命令找以 .sh 结尾的文件,使用*替代文件名字. find /oldboy -type f -name "*.sh" -mtime +7 -size +100k -size -10M 查找文件名中,包含有oldboy字节的文件. [root@znix 20170118]# find -type f -name "*oldboy*

扩展正则表达式及应用

第1章 扩展正则表达式 1.1  + 前一个字符连续出现了1次或1次以上 egrep  "0+" oldboy.txt  1次或1次以上 >=1 egrep  "0*" oldboy.txt  0次或0次以上 >=0 1.1.1 找到文本中的0 [root@znix ~]# egrep  "0+" oldboy.txt my qq num is 49000448. not 4900000448. [root@znix ~]# egre

HDU 1546 Idiomatic Phrases Game

链接: http://acm.hdu.edu.cn/showproblem.php?pid=1546 题目: Idiomatic Phrases Game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 969    Accepted Submission(s): 300 Problem Description Tom is playi

HDU 4081 Qin Shi Huang&#039;s National Road System (次小生成树算法)

链接: http://acm.hdu.edu.cn/showproblem.php?pid=4081 题目: Problem Description During the Warring States Period of ancient China(476 BC to 221 BC), there were seven kingdoms in China ---- they were Qi, Chu, Yan, Han, Zhao, Wei and Qin. Ying Zheng was the

HDOJ/HDU 1087 Super Jumping! Jumping! Jumping!(经典DP~)

Problem Description Nowadays, a kind of chess game called "Super Jumping! Jumping! Jumping!" is very popular in HDU. Maybe you are a good boy, and know little about this game, so I introduce it to you now. The game can be played by two or more t