zoukankan      html  css  js  c++  java
  • 国际象棋

    B 国际跳棋

    文件名 输入文件 输出文件 时间限制 空间限制
    chess.cpp/c/pas chess.in chess.out 1s 512MB
    题目描述
    国际跳棋是一种古老的棋类游戏,远在古埃及法老时期就已存在,现代国际跳
    棋是在 12 世纪定型的。国际跳棋是由各国的民族跳棋演变而来,其历史源远流长。
    简化版(与标准国际跳棋略有差别)国际跳棋规则:
    • 国际跳棋的棋盘由 10 × 10 共 100 个格子组成
    • 初始的时候,黑白双方各有 20 个棋子
    • 移动:可以将我方任意棋子向左前方或右前方移动 1 步
    • 跳吃:只要左前方、右前方、左后方、右后方相邻格子有对方棋子,且跳过这
    枚对方棋子后有空位,则可以跳过对方棋子并将对方棋子吃掉。如你的棋子在
    (x,y),对方棋子在 (x+1,y+1),(x+2,y+2) 为空,则你可以跳到 (x+2,y+2)
    并吃掉对方的棋子
    • 加冕:任何一个棋子在行动过程停止的时候停到了对方底线(最靠近对方的一
    行)就可以加冕,从此成为“王”。注意,连续跳吃的时候只有最后一步停在对
    方底线才可以加冕
    • 连跳:跳吃可以由多次跳吃组成。
    • 王的特权:王在移动的时候可以无视方向(左前、右前、左后、右后都可以),
    无视距离(走几步都行,直到遇到别的棋子),无视跳吃距离(比如说 (x,y) 跳
    过 (x + 3,y + 3) 落到 (x + 7,y + 7) 是可以的,但是这中间除了有被吃掉的对
    方棋子,不能有其他棋子
    • 在跳吃结束的时候才将被吃掉的棋子拿出棋盘,在这之前作为“屏障”,即这些
    棋子不能再次被跳吃,也不能落子
    • 按照以上规则,给定一个棋局,合法的操作方案有很多。然而,每次必须选择
    吃子最多的操作方案。比如,在某种棋局下,有 A、B、C、D 四种方案,A、
    B 吃子 3 枚,C 吃 1 枚,D 吃 0 枚,则真正合法的操作总数为 2
    作为一个国际跳棋迷,陶陶想要编写一个网络对战跳棋软件。然而他现在不会
    判断怎样的操作是合法的。对于给定的局面,你能给出所有合法的操作吗?
    4
    输入格式
    输入数据是两个十行十列的矩阵,第一个矩阵中的每个点可能是以下三种:
    • 0 空位置
    • 1 我方棋子
    • 2 对方棋子
    第二个矩阵描述的是国王的情况。若为 1,表示是国王;为 0 表示不是国王。
    输出格式
    输出第一行为一个数字,表示合法操作的个数 ans。
    下面一共 ans 行,每行表示一种合法操作中被操作的棋子。格式为 (x,y) 表示
    该棋子在第 x 行、第 y 列(注意,逗号后面没有空格)。如果某一个棋子有多种合
    法操作,则输出多遍。输出的顺序按从上到下、从左到右。
    如果没有任何合法操作,只输出一个 0 即可
    样例输入 1
    0000000000
    0000100000
    0000000200
    0000100000
    0000000200
    0000001000
    0000000200
    2000000000
    0101000200
    0000000000
    0000000000
    0000000000
    0000000000
    0000000000
    0000000000
    0000000000
    0000000000
    0000000000
    0000000000
    0000000000
    样例输出 
    2
    (6,7)
    (6,7)

    不知哪错了,60分

    #include<iostream>
    #include<queue>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    using namespace std;
    int map[12][12];
    bool is[12][12],die[12][12];
    int x[500],y[500],cnt,maxn=1;
    int dx[4]={1,1,-1,-1},dy[4]={1,-1,1,-1};
    void dfs1(int i,int j,int tot,int X,int Y)
    {
        if(tot==maxn)
        {
            x[++cnt]=X;
            y[cnt]=Y;
        }
        if(tot>maxn)
        {
            maxn=tot;cnt=0;
            x[++cnt]=X;
            y[cnt]=Y;
        }
        int xx,yy;
        for(int k=0;k<=3;k++)
        {
            xx=i+dx[k];yy=j+dy[k];
        if(map[xx][yy]==2&&(!die[xx][yy])&&map[xx+dx[k]][yy+dx[k]]==0&&(xx+dx[k])>=1&&(xx+dx[k])<=10&&(yy+dy[k])>=1&&(yy+dy[k])<=10)
            die[xx][yy]=1,dfs1(xx+dx[k],yy+dy[k],tot+1,X,Y),die[xx][yy]=0;
        }
    }
    void dfs2(int i,int j,int tot,int X,int Y)
    {    
        if(tot==maxn)
        {
            x[++cnt]=X;
            y[cnt]=Y;
        }
        if(tot>maxn)
        {
            maxn=tot;cnt=0;
            x[++cnt]=X;
            y[cnt]=Y;
        }
        int xx,yy,XX,YY;
        for(xx=i+1,yy=j+1;xx<10&&yy<10;xx++,yy++)//右下 
        if(map[xx][yy]==2)
        {
            if((!die[xx][yy]))
            {
                for(XX=xx+1,YY=yy+1;XX<=10&&YY<=10;XX++,YY++)
                if(map[XX][YY]==0)
                die[xx][yy]=1,dfs2(XX,YY,tot+1,X,Y),die[xx][yy]=0;
                else break;
            }
            break;
        }
            
        for(xx=i-1,yy=j+1;xx>1&&yy<10;xx--,yy++)//右上 
        if(map[xx][yy]==2)
        {
            if((!die[xx][yy]))
            {
                for(XX=xx-1,YY=yy+1;XX>=1&&YY<=10;XX--,YY++)
                if(map[XX][YY]==0)
                die[xx][yy]=1,dfs2(XX,YY,tot+1,X,Y),die[xx][yy]=0;
                else break;
            }
            break;
        }
        
        for(xx=i-1,yy=j-1;xx>1&&yy>1;xx--,yy--)//左上 
        if(map[xx][yy]==2)
        {
            if((!die[xx][yy]))
            {
                for(XX=xx-1,YY=yy-1;XX>=1&&YY>=1;XX--,YY--)
                if(map[XX][YY]==0)
                die[xx][yy]=1,dfs2(XX,YY,tot+1,X,Y),die[xx][yy]=0;
                else break;        
            }
            break;
        }
        for(xx=i+1,yy=j-1;xx<10&&yy>1;xx++,yy--)//左下
        if(map[xx][yy]==2)
        {
            if((!die[xx][yy]))
            {
                for(XX=xx+1,YY=yy-1;XX<=10&&YY>=1;XX++,YY--)
                if(map[XX][YY]==0)
                die[xx][yy]=1,dfs2(XX,YY,tot+1,X,Y),die[xx][yy]=0;
                else break;
            }
            break;
        }    
        
        return ;
        
    }
    void work()
    {
        for(int i=1;i<=10;i++)
        for(int j=1;j<=10;j++)    
        if(map[i][j]==1)        
        {        
            memset(die,0,sizeof die);
            if(!is[i][j])
                dfs1(i,j,0,i,j);
            else dfs2(i,j,0,i,j);
        }
        return ;
    }
    int main()
    {
        freopen("chess.in","r",stdin);
        freopen("chess.out","w",stdout);
        char c;
        for(int i=1;i<=10;i++)
        for(int j=1;j<=10;j++)
        {
            cin>>c;
            map[i][j]=c-'0';
        }
        for(int i=1;i<=10;i++)
        for(int j=1;j<=10;j++)
        {
            cin>>c;
            is[i][j]=c-'0';
        }    
        work();
        printf("%d
    ",cnt);
        for(int i=1;i<=cnt;i++)    
            printf("(%d,%d)
    ",x[i],y[i]);    
        return 0;
    } 
    60分

    闷了半小时我终于明白了。

    因为我看了数据,我错的那些点都是一个子也吃不了的。

    所以我又写了个特判,就过了。

    说一说思路吧。

      对于普通棋子和王分开搜索。

      普通棋子:

          看一看四角有没有敌人,有的话看看后面有没有空位,有空位就扩展。没有就不管。

      王棋:

              四个方向找一遍,杀遇到的第一个棋子,跳到它和下一个棋子之间的任何位置都行。

      对于每种状态,我只看他吃掉的棋子和当前吃掉最多棋子的关系,

                                  相同就加进来,大于就清空重新加入。

      最后如果一颗棋子都吃不了,就看看一步能挪到多少种不同位置。(注意,这时普通棋子只能向上走)

    #include<iostream>
    #include<queue>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    using namespace std;
    int map[12][12];
    bool is[12][12],die[12][12];
    int x[500],y[500],cnt,maxn;
    int dx[4]={1,1,-1,-1},dy[4]={1,-1,1,-1};
    void dfs1(int i,int j,int tot,int X,int Y)
    {
        if((i!=X)&&j!=Y)
        {
        
        if(tot==maxn)
        {
            x[++cnt]=X;
            y[cnt]=Y;
        }
        if(tot>maxn)
        {
            maxn=tot;cnt=0;
            x[++cnt]=X;
            y[cnt]=Y;
        }
        
        }
        int xx,yy;
        for(int k=0;k<=3;k++)
        {
            xx=i+dx[k];yy=j+dy[k];
        if(map[xx][yy]==2&&(!die[xx][yy])&&map[xx+dx[k]][yy+dy[k]]==0&&(xx+dx[k])>=1&&(xx+dx[k])<=10&&(yy+dy[k])>=1&&(yy+dy[k])<=10)
            die[xx][yy]=1,dfs1(xx+dx[k],yy+dy[k],tot+1,X,Y),die[xx][yy]=0;
        }
    }
    void dfs2(int i,int j,int tot,int X,int Y)
    {    
        if(tot==maxn)
        {
            x[++cnt]=X;
            y[cnt]=Y;
        }
        if(tot>maxn)
        {
            maxn=tot;cnt=0;
            x[++cnt]=X;
            y[cnt]=Y;
        }
        int xx,yy,XX,YY;
        for(xx=i+1,yy=j+1;xx<10&&yy<10;xx++,yy++)//右下 
        if(map[xx][yy]==2)
        {
            if((!die[xx][yy]))
            {
                for(XX=xx+1,YY=yy+1;XX<=10&&YY<=10;XX++,YY++)
                if(map[XX][YY]==0)
                die[xx][yy]=1,dfs2(XX,YY,tot+1,X,Y),die[xx][yy]=0;
                else break;
            }
            break;
        }
            
        for(xx=i-1,yy=j+1;xx>1&&yy<10;xx--,yy++)//右上 
        if(map[xx][yy]==2)
        {
            if((!die[xx][yy]))
            {
                for(XX=xx-1,YY=yy+1;XX>=1&&YY<=10;XX--,YY++)
                if(map[XX][YY]==0)
                die[xx][yy]=1,dfs2(XX,YY,tot+1,X,Y),die[xx][yy]=0;
                else break;
            }
            break;
        }
        
        for(xx=i-1,yy=j-1;xx>1&&yy>1;xx--,yy--)//左上 
        if(map[xx][yy]==2)
        {
            if((!die[xx][yy]))
            {
                for(XX=xx-1,YY=yy-1;XX>=1&&YY>=1;XX--,YY--)
                if(map[XX][YY]==0)
                die[xx][yy]=1,dfs2(XX,YY,tot+1,X,Y),die[xx][yy]=0;
                else break;        
            }
            break;
        }
        for(xx=i+1,yy=j-1;xx<10&&yy>1;xx++,yy--)//左下
        if(map[xx][yy]==2)
        {
            if((!die[xx][yy]))
            {
                for(XX=xx+1,YY=yy-1;XX<=10&&YY>=1;XX++,YY--)
                if(map[XX][YY]==0)
                die[xx][yy]=1,dfs2(XX,YY,tot+1,X,Y),die[xx][yy]=0;
                else break;
            }
            break;
        }    
        
        return ;
        
    }
    void work()
    {
        for(int i=1;i<=10;i++)
        for(int j=1;j<=10;j++)    
        if(map[i][j]==1)        
        {        
            memset(die,0,sizeof die);
            if(!is[i][j])
                dfs1(i,j,0,i,j);
            else dfs2(i,j,0,i,j);
        }
        
        if(!maxn)
        {    cnt=0;
        for(int i=1;i<=10;i++)
        for(int j=1;j<=10;j++)    
        if(map[i][j]==1)        
        {        
            memset(die,0,sizeof die);
            if(!is[i][j])
            {
                int xx,yy;
                for(int k=2;k<=3;k++)
                {
                    xx=i+dx[k];yy=j+dy[k];
                    if((!map[xx][yy])&&xx>=1&&xx<=10&&yy>=1&&yy<=10)
                    {
                        x[++cnt]=i;
                        y[cnt]=j;
                    }
                }
            }
            else 
            {
                int xx,yy;
                for(int k=0;k<=3;k++)
                for(int l=1;l<=10;l++)
                {
                    xx=i+dx[k]*l;yy=j+dy[k]*l;
                    if((!map[xx][yy])&&xx>=1&&xx<=10&&yy>=1&&yy<=10)
                    {
                        x[++cnt]=i;
                        y[cnt]=j;
                    }else
                    if(map[xx][yy])    break;
                }
            }
        }
        
        }
        return ;
    }
    int main()
    {
        freopen("chess.in","r",stdin);
        freopen("chess.ans","w",stdout);
        char c;
        for(int i=1;i<=10;i++)
        for(int j=1;j<=10;j++)
        {
            cin>>c;
            map[i][j]=c-'0';
        }
        for(int i=1;i<=10;i++)
        for(int j=1;j<=10;j++)
        {
            cin>>c;
            is[i][j]=c-'0';
        }    
        work();
        printf("%d
    ",cnt);
        for(int i=1;i<=cnt;i++)    
            printf("(%d,%d)
    ",x[i],y[i]);    
        return 0;
    } 
    100分
  • 相关阅读:
    jquery animate() stop() finish() 方法使用
    ant 相关命令
    ant 安装 网址
    邮件
    webdriver until
    python HTML报告
    登录
    yun
    centos7搭建smb服务
    爬取图片
  • 原文地址:https://www.cnblogs.com/CLGYPYJ/p/7727625.html
Copyright © 2011-2022 走看看