zoukankan      html  css  js  c++  java
  • HDU 1691 Chinese Chess

    http://acm.hdu.edu.cn/showproblem.php?pid=1691

    博客里面不好骂人,所以就不说太多了。

    有几点注意:

    1、象可能跑到不可能达到的位置

    2、兵要判断后退这种情况

    View Code
      1 #include <stdio.h>
      2 
      3 int map[20][20];
      4 int Kinga,Kingb;//红王坐标 
      5 int Kingc,Kingd;//黑王坐标 
      6 int abs(int a){return a>0?a:-a;}
      7 int KingFaceToFace()//两王是否相对 
      8 {
      9     int i;
     10     if(Kingb==20||Kingd==20)return 0;
     11     if(Kingb==Kingd)
     12     {
     13         for(i=Kingc+1;i<Kinga;i++)
     14             if(map[i][Kingb]!=0)
     15                 return 0;
     16         return 1;
     17     }
     18     return 0;
     19 }
     20 int King(int a,int b,int c,int d)
     21 {
     22     if((abs(a-c)+abs(b-d))!=1)return 0;//王一次走一步 
     23     if(map[a][b]==1&&(a<8||b<4||b>6||c<8||d<4||d>6))//红王出九宫格 
     24         return 0;
     25     if(map[a][b]==8&&(a>3||b<4||b>6||c>3||d<4||d>6))//黑王出九宫格
     26         return 0;
     27     if(map[a][b]==1){
     28         Kinga=c;
     29         Kingb=d;
     30     }
     31     if(map[a][b]==8){
     32         Kingc=c;
     33         Kingd=d;
     34     }
     35     map[c][d]=map[a][b];
     36     map[a][b]=0; 
     37     if(KingFaceToFace())
     38         return 0;
     39     return 1;
     40 }
     41 int Mandarins(int a,int b,int c,int d)
     42 {
     43     if(abs(a-c)!=1||abs(b-d)!=1)return 0;//士走斜一格
     44     if(map[a][b]==2&&(c<8||c>10||d<4||d>6))//红士出九宫格 
     45         return 0;
     46     if(map[a][b]==9&&(c>3||c<1||d<4||d>6))//黑士出九宫格
     47         return 0;
     48     map[c][d]=map[a][b];
     49     map[a][b]=0; 
     50     if(KingFaceToFace())
     51         return 0;
     52     return 1;
     53 }
     54 int Elephants(int a,int b,int c,int d)
     55 {
     56     if(abs(a-c)!=2||abs(b-d)!=2)return 0;//象走田 
     57     if(map[a][b]==3&&(!(((a==6||a==10)&&(b==3||b==7))||(a==8&&(b==1||b==5||b==9)))||!(((c==6||c==10)&&(d==3||d==7))||(c==8&&(d==1||d==5||d==9)))))return 0;//红象非主流 
     58     if(map[a][b]==10&&(!(((a==5||a==1)&&(b==3||b==7))||(a==3&&(b==1||b==5||b==9)))||!(((c==5||c==1)&&(d==3||d==7))||(c==3&&(d==1||d==5||d==9)))))return 0;//黑象非主流 
     59     int x,y;
     60     x=(a+c)/2;
     61     y=(b+d)/2;
     62     if(map[x][y])//别象脚 
     63         return 0;
     64     map[c][d]=map[a][b];
     65     map[a][b]=0;
     66     if(KingFaceToFace())
     67         return 0;
     68     return 1; 
     69 } 
     70 int Knights(int a,int b,int c,int d)
     71 {
     72     int luoma[8][2]={{2,1},{2,-1},{-2,1},{-2,-1},{1,2},{1,-2},{-1,2},{-1,-2}};//落马的位置 
     73     int majiao[8][2]={{1,0},{1,0},{-1,0},{-1,0},{0,1},{0,-1},{0,1},{0,-1}};//马脚的位置 
     74     int i;
     75     for(i=0;i<8;i++)
     76     {
     77         if(a+luoma[i][0]==c&&b+luoma[i][1]==d)
     78         {
     79             if(map[a+majiao[i][0]][b+majiao[i][1]])//别马脚 
     80                 return 0;
     81             break;
     82         }
     83     }
     84     if(i==8)return 0;
     85     if(map[c][d]==1)Kinga=Kingb=20;
     86     if(map[c][d]==8)Kingc=Kingd=20;
     87     map[c][d]=map[a][b];
     88     map[a][b]=0;
     89     if(KingFaceToFace())
     90         return 0;
     91     return 1;
     92 }
     93 int Rooks(int a,int b,int c,int d)
     94 {
     95     int i;
     96     if(a!=c&&b!=d)return 0;//车走十字 
     97     if(a==c&&d>b)//车向右走中间不能有子 
     98         for(i=b+1;i<d;i++)
     99             if(map[a][i])
    100                 return 0;
    101     if(a==c&&d<b)//车向左走中间不能有子
    102         for(i=b-1;i>d;i--)
    103             if(map[a][i])
    104                 return 0;
    105     if(b==d&&a>c)//车向上走中间不能有子 
    106         for(i=a-1;i>c;i--)
    107             if(map[i][b])
    108                 return 0;
    109     if(b==d&&a<c)//车向下走中间不能有子 
    110         for(i=a+1;i<c;i++)
    111             if(map[i][b])
    112                 return 0;
    113     if(map[c][d]==1)Kinga=Kingb=20;
    114     if(map[c][d]==8)Kingc=Kingd=20;
    115     map[c][d]=map[a][b];
    116     map[a][b]=0;
    117     if(KingFaceToFace())
    118         return 0;
    119     return 1; 
    120 }
    121 int Cannons(int a,int b,int c,int d)
    122 {
    123     int i,cnt=0;
    124     if(a!=c&&b!=d)return 0;//炮走十字 
    125     if(a==c&&d>b) 
    126     {
    127         for(i=b+1;i<d;i++)
    128             if(map[a][i]!=0)
    129                 cnt++;
    130         if(cnt>1||(cnt==1&&map[c][d]==0)||(cnt==0&&map[c][d]))return 0;//中间有一子以上或有一子但不能完成吃子 
    131     }
    132     if(a==c&&d<b)
    133     {
    134         for(i=b-1;i>d;i--)
    135             if(map[a][i]!=0)
    136                 cnt++;
    137         if(cnt>1||(cnt==1&&map[c][d]==0)||(cnt==0&&map[c][d]))return 0;
    138     }
    139     if(b==d&&a>c) 
    140     {
    141         for(i=a-1;i>c;i--)
    142             if(map[i][b]!=0)
    143                 cnt++;
    144         if(cnt>1||(cnt==1&&map[c][d]==0)||(cnt==0&&map[c][d]))return 0;
    145     }
    146     if(b==d&&a<c)
    147     {
    148         for(i=a+1;i<c;i++)
    149             if(map[i][b]!=0)
    150                 cnt++; 
    151         if(cnt>1||(cnt==1&&map[c][d]==0)||(cnt==0&&map[c][d]))return 0;
    152     }
    153     if(map[c][d]==1)Kinga=Kingb=20;
    154     if(map[c][d]==8)Kingc=Kingd=20;
    155     map[c][d]=map[a][b];
    156     map[a][b]=0;
    157     if(KingFaceToFace())
    158         return 0;
    159     return 1;
    160 }
    161 int Pawns(int a,int b,int c,int d)
    162 {
    163     if(abs(a-c)+abs(b-d)!=1)return 0;
    164     if(map[a][b]==14&&a<=5)//黑兵没过河只能向前走一步 
    165         if(c-a!=1||b!=d)
    166             return 0;
    167     if(map[a][b]==7&&a>=6)//红兵没过河只能向前走一步
    168         if(c-a!=-1||b!=d)
    169             return 0;
    170     if(map[a][b]==14&&a>5)//黑兵过河后能向前或左或右走一步 
    171         if(c-a==-1)
    172             return 0; 
    173     if(map[a][b]==7&&a<6)//红兵过河后能向前或左或右走一步
    174         if(c-a==1)
    175             return 0;
    176     if(map[c][d]==1)Kinga=Kingb=20;
    177     if(map[c][d]==8)Kingc=Kingd=20;
    178     map[c][d]=map[a][b];
    179     map[a][b]=0;
    180     if(KingFaceToFace())
    181         return 0;
    182     return 1; 
    183 }
    184 int move(int a,int b,int c,int d,int k)
    185 {
    186     if(map[a][b]<=k*7||map[a][b]>k*7+7)//红黑方不按顺序走 
    187         return 0;
    188     if(a>10||b>9||c>10||d>9||a<1||b<1||c<1||d<1)return 0;//越界 
    189     if(map[a][b]==0)return 0;//无子
    190     if((map[a][b]==1||map[a][b]==2||map[a][b]==3||map[a][b]==4||map[a][b]==5||map[a][b]==6||map[a][b]==7)&&(map[c][d]==1||map[c][d]==2||map[c][d]==3||map[c][d]==4||map[c][d]==5||map[c][d]==6||map[c][d]==7)) 
    191         return 0;//红方吃自己的子
    192     if((map[a][b]==8||map[a][b]==9||map[a][b]==10||map[a][b]==11||map[a][b]==12||map[a][b]==13||map[a][b]==14)&&(map[c][d]==8||map[c][d]==9||map[c][d]==10||map[c][d]==11||map[c][d]==12||map[c][d]==13||map[c][d]==14))
    193         return 0;//黑方吃自己的子 
    194     if(map[a][b]==1||map[a][b]==8)//走王 
    195         return King(a,b,c,d);
    196     if(map[a][b]==2||map[a][b]==9)//走士 
    197         return Mandarins(a,b,c,d);
    198     if(map[a][b]==3||map[a][b]==10)//走象 
    199         return Elephants(a,b,c,d);
    200     if(map[a][b]==4||map[a][b]==11)//走马 
    201         return Knights(a,b,c,d);
    202     if(map[a][b]==5||map[a][b]==12)//走车 
    203         return Rooks(a,b,c,d);
    204     if(map[a][b]==6||map[a][b]==13)//走炮 
    205         return Cannons(a,b,c,d);
    206     if(map[a][b]==7||map[a][b]==14)//走兵 
    207         return Pawns(a,b,c,d);
    208 } 
    209 int main()
    210 {
    211     int t;
    212     int n,k;
    213     int a,b,c,d;
    214     int i,j;
    215     int nCase=1;
    216     int step;
    217     scanf("%d",&t);
    218     while(t--)
    219     {
    220         for(i=1;i<=10;i++)
    221         {
    222             for(j=1;j<=9;j++)
    223             {
    224                 scanf("%d",&map[i][j]);
    225                 if(map[i][j]==1){
    226                     Kinga=i;
    227                     Kingb=j;
    228                 }
    229                 if(map[i][j]==8){
    230                     Kingc=i;
    231                     Kingd=j;
    232                 }
    233             }
    234         }
    235         scanf("%d%d",&n,&k);
    236         step=0;
    237         for(i=1;i<=n;i++)
    238         {
    239             scanf("%d%d%d%d",&a,&b,&c,&d);
    240             if(!step)
    241             {
    242                 if(!move(a,b,c,d,k))//非法移动 
    243                     step=i;
    244                 if(i!=n&&(Kingb==20||Kingd==20))//吃王 
    245                     step=i+1;
    246             }
    247             k=!k;
    248         }
    249         printf("Case %d: ",nCase++);
    250         if(!step)
    251             printf("Legal move\n");
    252         else
    253             printf("Illegal move on step %d\n",step);
    254     }
    255     return 0;
    256 }
  • 相关阅读:
    简易版Spring Ioc (转载)
    网站策划:网站用户需求分析
    js实现树形菜单
    js实现滑动门效果
    HTML的DOM对象的nodeName
    javascript实现页面悬浮导航
    jQuery EasyUI 窗口 – 创建简单窗口
    Exceptions
    Java Cookbook-Date and Times
    表单属性深入
  • 原文地址:https://www.cnblogs.com/xiaohongmao/p/2456841.html
Copyright © 2011-2022 走看看