UVA 10838 (alpha-bate剪枝搜索)

 可以看这三个博客,alpah-bate算法基本上就能懂了:

https://blog.csdn.net/zkybeck_ck/article/details/45644471

https://blog.csdn.net/zkybeck_ck/article/details/45645031

https://blog.csdn.net/tangchenyi/article/details/22925957

#include<cstdio>
#include<queue>
#include<map>
#include<vector>

using namespace std;

#define INF 0x3f3f3f3f

struct state{
    char g[4][5];
    int isend(){
        int b=0,w=0;
        for(int i=0;i<4;i++){
            for(int j=0;j<4;j++){
                if(g[i][j]=='p') b++;
                if(g[i][j]=='P') w++;
            }
        }
        if(b==0||w==0) return 1;
        for(int i=0;i<4;i++){
            if(g[0][i]=='P') return 1;
            if(g[3][i]=='p') return 1;
        }
        return 0;
    }
};

int alpha_bate(state board,int depth,int alpha,int bate){
    if(board.isend()) return depth%2==0?-depth:depth;
    int moveable=0;
    if(depth%2==0){
        for(int i=0;i<4;i++){
            for(int j=0;j<4;j++){
                if(board.g[i][j]=='P'){
                    for(int k=j-1;k<=j+1;k++){
                        if(k<0||k>=4) continue;
                        if((k!=j&&board.g[i-1][k]=='p')||(k==j&&board.g[i-1][j]=='.')){
                            state s=board;
                            s.g[i][j]='.';s.g[i-1][k]='P';
                            alpha=max(alpha,alpha_bate(s,depth-1,alpha,bate));
                            if(bate<=alpha) return alpha;       //剪枝,不进行搜索,因为不可能再有最优解
                            moveable=1;
                        }
                    }
                }
            }
        }
        if(!moveable) return -depth;        //到达叶子
        return alpha;
    }
    else{
        for(int i=0;i<4;i++){
            for(int j=0;j<4;j++){
                if(board.g[i][j]=='p'){
                    for(int k=j-1;k<=j+1;k++){
                        if(k<0||k>=4) continue;
                        if((k!=j&&board.g[i+1][k]=='P')||(k==j&&board.g[i+1][j]=='.')){
                            state s=board;
                            s.g[i][j]='.';s.g[i+1][k]='p';
                            bate=min(bate,alpha_bate(s,depth-1,alpha,bate));
                            if(bate<=alpha) bate;       //剪枝,不进行搜索,因为不可能再有最优解
                            moveable=1;
                        }
                    }
                }
            }
        }
        if(!moveable) return depth;        //到达叶子
        return bate;
    }
}

int main(){
    int cs;
    scanf("%d",&cs);
    while(cs--){
        state init;
        for(int i=0;i<4;i++){
            scanf("%s",init.g[i]);
        }
        int ret=alpha_bate(init,36,-999999,999999);
        if(ret>=0) printf("white (%d)\n",36-ret);
        else printf("black (%d)\n",36+ret);
    }
    return 0;
}
/*
2
.ppp
....
.PPP
....
...p
...p
pP.P
...P
*/

猜你喜欢

转载自blog.csdn.net/qq_40679299/article/details/81195606