可以看这三个博客,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
*/