P4576 [CQOI2013]棋盘游戏

本文深入探讨了一种博弈搜索算法在黑白棋游戏中的应用,详细解释了如何通过递归深度优先搜索来评估游戏状态,实现黑子和白子的最优移动策略。文章提供了完整的C++代码实现,展示了算法的具体运作过程。

传送门

很显然,除非白子和黑子相邻,否则必然是黑子获胜虽然我并没有看出来

那么现在对黑子来说它要尽可能快的赢,对白子它要多苟一会儿

然后就是这个叫做对抗搜索的东西了

//minamoto
#include<bits/stdc++.h>
#define fp(i,a,b) for(register int i=a,I=b+1;i<I;++i)
#define fd(i,a,b) for(register int i=a,I=b-1;i>I;--i)
using namespace std;
inline int max(const int &x,const int &y){return x>y?x:y;}
inline int min(const int &x,const int &y){return x<y?x:y;}
inline int _abs(const int &x){return x<0?-x:x;}
int dx[]={1,0,-1,0,2,0,-2,0},dy[]={0,1,0,-1,0,2,0,-2};
const int N=21,inf=1e9;
int f[2][65][N][N][N][N];
int n,a,b,c,d;
int dfs(int x,int y,int a,int b,int c,int d){
    if(y>3*n)return inf;if(a==c&&b==d)return x?inf:0;
    if(f[x][y][a][b][c][d])return f[x][y][a][b][c][d];
    int ans=0,xx,yy;
    if(x){
        ans=inf;fp(i,0,7){
            xx=c+dx[i],yy=d+dy[i];
            if(xx>=1&&xx<=n&&yy>=1&&yy<=n)ans=min(ans,dfs(0,y+1,a,b,xx,yy));
        }
    }else{
        fp(i,0,3){
            xx=a+dx[i],yy=b+dy[i];
            if(xx>=1&&xx<=n&&yy>=1&&yy<=n)ans=max(ans,dfs(1,y+1,xx,yy,c,d));
        }
    }f[x][y][a][b][c][d]=++ans;return ans;
}
int main(){
//  freopen("testdata.in","r",stdin);
    scanf("%d%d%d%d%d",&n,&a,&b,&c,&d);
    if(_abs(a-c)+_abs(d-b)==1)return puts("WHITE 1"),0;
    return printf("BLACK %d\n",dfs(0,0,a,b,c,d)),0;
}

转载于:https://www.cnblogs.com/bztMinamoto/p/10040028.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值