2011ACM福州网络预选赛B题 HDU4062 Abalone

 

感谢会长君的指导...现在格式应该正常了...


题目大意:给出一种叫做“大王鲍”的桌游,给出游戏规则和双方起始的位置,问先走一方能否获胜...如果不能,问在先走一方走后,后手一方有无必胜策略。


如卓锋君所言...是一道神模拟题...把规则全都写对了就好...

判断白赢的方法:检测棋盘边上有没有黑色棋子;如果有,往六个方向搜寻,记录连成一线的黑色棋子数目;如果黑色棋子数目小于3,再看黑色棋子外侧相邻有没有白色棋子,记录连成一线的白色棋子数目;如果白色棋子的数目大于黑色棋子的数目,再判断白色棋子沿着这个方向能不能推下黑色棋子;如果黑色棋子被推下后黑色棋子数目小于9,则白赢。

如果白不赢,那么枚举白的所有走法(1个棋子能往6个方向走,2个连成直线的棋子能往6个方向走,还能推动1个黑棋,3个连成直线的棋子能往6个方向走,还能推动1个或2个黑棋。),判断黑能不能赢...


如果都不赢,就输出Draw...


代码如下:

//by NKU lkjslkjdlk
#include<cstdio>
#include<cstring>
#include<set>
#include<algorithm>
#include<iostream>

using namespace std;

struct point{
    int h,l;
    friend bool operator <(point p1,point p2){return p1.h<p2.h||(p1.h==p2.h&&p1.l<p2.l);}
};
int h[]={1,1,1,1,1,2,3,4,5,6,7,8,9,9,9,9,9,8,7,6,5,4,3,2};
int l[]={5,7,9,11,13,14,15,16,17,16,15,14,13,11,9,7,5,4,3,2,1,2,3,4};
int hMove[]={0,-1,-1,0,1,1},lMove[]={-2,-1,1,2,1,-1};
int cas,bnum,wnum;char map[19][19];set<point> s,whs;bool hasmove;
int judge(char ch1,char ch2){
    int i,j,cnt1,cnt2;
    for(i=0;i<24;i++){
        if(map[h[i]][l[i]]==ch1){
            for(j=0;j<6;j++){
                cnt1=1;cnt2=0;
                if(map[h[i]+hMove[j]][l[i]+lMove[j]]==0||map[h[i]+hMove[j]][l[i]+lMove[j]]=='.')    
                    continue;
                while(map[h[i]+cnt1*hMove[j]][l[i]+cnt1*lMove[j]]==ch1)    
                    cnt1++;
                if(cnt1>=3)    continue;
                while(map[h[i]+(cnt1+cnt2)*hMove[j]][l[i]+(cnt1+cnt2)*lMove[j]]==ch2)    
                    cnt2++;
                if(cnt2>cnt1){
                    if(map[h[i]-hMove[j]][l[i]-lMove[j]]==0){
                        if(ch1=='B'&&bnum-cnt1<9)   return 2;
                        if(ch1=='W'&&wnum-cnt1<9)   return 0;
                    }
                }
            }
        }
    }
    return 1;
}
int wmove1(int h,int l){
    int j,flag;bool idx;
    for(j=0;j<6;j++){
        idx=false;
        if(map[h+hMove[j]][l+lMove[j]]=='.'){
            swap(map[h][l],map[h+hMove[j]][l+lMove[j]]);
            idx=true;hasmove=true;
        }
        if(idx){
            flag=judge('W','B');
            swap(map[h][l],map[h+hMove[j]][l+lMove[j]]);
            if(flag==1)    return flag;
        }
    }
    return 0;
}
int wmove2(int h1,int l1,int h2,int l2){
    int j,flag;int idx;
    for(j=0;j<6;j++){
        idx=0;
        if(map[h1+hMove[j]][l1+lMove[j]]=='.'&&map[h2+hMove[j]][l2+lMove[j]]=='.'){
            swap(map[h1][l1],map[h1+hMove[j]][l1+lMove[j]]);
            swap(map[h2][l2],map[h2+hMove[j]][l2+lMove[j]]);
            idx=1;
        }
        if(h2-h1==hMove[j]&&l2-l1==lMove[j]){
            if(map[h2+hMove[j]][l2+lMove[j]]=='.'){
                swap(map[h1][l1],map[h2+hMove[j]][l2+lMove[j]]);
                idx=2;
            }
            if(map[h2+hMove[j]][l2+lMove[j]]=='B'&&map[h2+2*hMove[j]][l2+2*lMove[j]]=='.'){
                swap(map[h2+hMove[j]][l2+lMove[j]],map[h2+2*hMove[j]][l2+2*lMove[j]]);
                swap(map[h1][l1],map[h2+hMove[j]][l2+lMove[j]]);
                idx=3;
            }
            if(map[h2+hMove[j]][l2+lMove[j]]=='B'&&map[h2+2*hMove[j]][l2+2*lMove[j]]==0){
                map[h2+hMove[j]][l2+lMove[j]]='W';
                map[h1][l1]='.';
                idx=4;            
            }
        }
        if(idx) hasmove=true;
        if(idx==1){
            flag=judge('W','B');
            swap(map[h1][l1],map[h1+hMove[j]][l1+lMove[j]]);
            swap(map[h2][l2],map[h2+hMove[j]][l2+lMove[j]]);
            if(flag==1)    return flag;
        }
        if(idx==2){
            flag=judge('W','B');
            swap(map[h1][l1],map[h2+hMove[j]][l2+lMove[j]]);
            if(flag==1)    return flag;
        }
        if(idx==3){
            flag=judge('W','B');
            swap(map[h1][l1],map[h2+hMove[j]][l2+lMove[j]]);
            swap(map[h2+hMove[j]][l2+lMove[j]],map[h2+2*hMove[j]][l2+2*lMove[j]]);
            if(flag==1)    return flag;
        }
        if(idx==4){
            flag=judge('W','B');
            map[h2+hMove[j]][l2+lMove[j]]='B';
            map[h1][l1]='W';
            if(flag==1)    return flag;
        }    
    }
    return 0;
}
int wmove3(int h1,int l1,int h2,int l2,int h3,int l3)
{
    int j,flag;int idx;
    for(j=0;j<6;j++){
        idx=0;
        if(map[h1+hMove[j]][l1+lMove[j]]=='.'&&map[h2+hMove[j]][l2+lMove[j]]=='.'
            &&map[h3+hMove[j]][l3+lMove[j]]=='.'){
            swap(map[h1][l1],map[h1+hMove[j]][l1+lMove[j]]);
            swap(map[h2][l2],map[h2+hMove[j]][l2+lMove[j]]);
            swap(map[h3][l3],map[h3+hMove[j]][l3+lMove[j]]);
            idx=1;
        }
        if(h2-h1==hMove[j]&&l2-l1==lMove[j]){
            if(map[h3+hMove[j]][l3+lMove[j]]=='.'){
                swap(map[h1][l1],map[h3+hMove[j]][l3+lMove[j]]);
                idx=2;
            }
            if(map[h3+hMove[j]][l3+lMove[j]]=='B'&&map[h3+2*hMove[j]][l3+2*lMove[j]]=='.'){
                swap(map[h3+hMove[j]][l3+lMove[j]],map[h3+2*hMove[j]][l3+2*lMove[j]]);
                swap(map[h1][l1],map[h3+hMove[j]][l3+lMove[j]]);
                idx=3;
            }
            if(map[h3+hMove[j]][l3+lMove[j]]=='B'&&map[h3+2*hMove[j]][l3+2*lMove[j]]==0){
                map[h1][l1]='.';
                map[h3+hMove[j]][l3+lMove[j]]='W';
                idx=4;
            }
            if(map[h3+hMove[j]][l3+lMove[j]]=='B'&&map[h3+2*hMove[j]][l3+2*lMove[j]]=='B'
                &&map[h3+3*hMove[j]][l3+3*lMove[j]]=='.'){
                    swap(map[h3+hMove[j]][l3+lMove[j]],map[h3+3*hMove[j]][l3+3*lMove[j]]);
                    swap(map[h1][l1],map[h3+hMove[j]][l3+lMove[j]]);
                    idx=5;
            }
            if(map[h3+hMove[j]][l3+lMove[j]]=='B'&&map[h3+2*hMove[j]][l3+2*lMove[j]]=='B'
                &&map[h3+3*hMove[j]][l3+3*lMove[j]]==0){
                    map[h1][l1]='.';
                    map[h2][l2]='.';
                    map[h3+hMove[j]][l3+lMove[j]]='W';
                    map[h3+2*hMove[j]][l3+2*lMove[j]]='W';
                    idx=6;
            }
        }
        if(idx) hasmove=true;
        if(idx==1){
            flag=judge('W','B');
            swap(map[h1][l1],map[h1+hMove[j]][l1+lMove[j]]);
            swap(map[h2][l2],map[h2+hMove[j]][l2+lMove[j]]);
            swap(map[h3][l3],map[h3+hMove[j]][l3+lMove[j]]);
            if(flag==1)    return flag;
        }
        if(idx==2){
            flag=judge('W','B');
            swap(map[h1][l1],map[h3+hMove[j]][l3+lMove[j]]);
            if(flag==1)    return flag;
        }
        if(idx==3){
            flag=judge('W','B');
            swap(map[h1][l1],map[h3+hMove[j]][l3+lMove[j]]);
            swap(map[h3+hMove[j]][l3+lMove[j]],map[h3+2*hMove[j]][l3+2*lMove[j]]);
            if(flag==1)    return flag;
        }
        if(idx==4){
            flag=judge('W','B');
            map[h3+hMove[j]][l3+lMove[j]]='B';
            map[h1][l1]='W';
            if(flag==1)    return flag;
        }
        if(idx==5){
            flag=judge('W','B');
            swap(map[h1][l1],map[h3+hMove[j]][l3+lMove[j]]);
            swap(map[h3+hMove[j]][l3+lMove[j]],map[h3+3*hMove[j]][l3+3*lMove[j]]);
            if(flag==1)    return flag;
        }
        if(idx==6){
            flag=judge('W','B');
            map[h1][l1]='W';
            map[h2][l2]='W';
            map[h3+hMove[j]][l3+lMove[j]]='B';
            map[h3+2*hMove[j]][l3+2*lMove[j]]='B';
            if(flag==1)    return flag;
        }
    }
    return 0;
}
void mycin(){
    int i;
    for(i=5;i<=13;i+=2) cin>>map[1][i];
    for(i=4;i<=14;i+=2) cin>>map[2][i];
    for(i=3;i<=15;i+=2) cin>>map[3][i];
    for(i=2;i<=16;i+=2) cin>>map[4][i];
    for(i=1;i<=17;i+=2) cin>>map[5][i];
    for(i=2;i<=16;i+=2) cin>>map[6][i];
    for(i=3;i<=15;i+=2) cin>>map[7][i];
    for(i=4;i<=14;i+=2) cin>>map[8][i];
    for(i=5;i<=13;i+=2) cin>>map[9][i];
}
int main()
{
    int i,j,k=1,flag;point p;
    set<point>::iterator iter;
    scanf("%d",&cas);
    while(cas--){
        s.clear();whs.clear();hasmove=false;
        memset(map,0,sizeof(map));
        mycin();
        for(i=1,wnum=bnum=0;i<=9;i++){
            for(j=1;j<=17;j++){
                if(map[i][j]=='W'){wnum++;p.h=i;p.l=j;whs.insert(p);}
                if(map[i][j]=='B')    bnum++;
            }
        }
        flag=judge('B','W');
        for(iter=whs.begin();iter!=whs.end()&&flag!=2;iter++){
            int h1=iter->h,l1=iter->l;
            flag=wmove1(h1,l1);
            if(flag==1)    break;
        }
        for(iter=whs.begin();iter!=whs.end()&&flag!=1&&flag!=2;iter++){
            for(j=0;j<6&&flag!=1;j++){
                if(map[iter->h+hMove[j]][iter->l+lMove[j]]=='W'){
                    int h1=iter->h,l1=iter->l,h2=h1+hMove[j],l2=l1+lMove[j];
                    flag=wmove2(h1,l1,h2,l2);
                    if(flag==1)    break;
                }
            }
        }
        for(iter=whs.begin();iter!=whs.end()&&flag!=1&&flag!=2;iter++){
            for(j=0;j<6&&flag!=1;j++){
                if(map[iter->h+hMove[j]][iter->l+lMove[j]]=='W'&&map[iter->h+2*hMove[j]][iter->l+2*lMove[j]]=='W'){
                    int h1=iter->h,l1=iter->l,h2=h1+hMove[j],l2=l1+lMove[j],h3=h1+2*hMove[j],l3=l1+2*lMove[j];
                    flag=wmove3(h1,l1,h2,l2,h3,l3);
                    if(flag==1)    break;
                }
            }
        }
        if(hasmove==false&&flag!=2)
            flag=judge('W','B');
        printf("Case %d: ",k++);
        if(flag==0)    printf("Black\n");
        if(flag==1) printf("Draw\n");
        if(flag==2)    printf("White\n");
    }
    return 0;
}


 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值