bzoj3106: [cqoi2013]棋盘游戏 对抗搜索

44 篇文章 0 订阅
f[X][Y][A][B][C][D]代表白在A,B;黑在C,D时走了Y步。如果X是0代表这一步改白走。
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
#define INF 0x3fffffff
int f[2][61][22][22][22][22];
int n,a,b,c,d,i,j,k;
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)
   {
       if(x) return INF;
       return 0;
   }
   if(f[x][y][a][b][c][d]) return f[x][y][a][b][c][d];
   int ans=0;
   if(x>0)
   {
       ans=INF;
       if(c > 1)
            ans=min(ans,dfs(0,y+1,a,b,c-1,d));
       if(c > 2)
            ans=min(ans,dfs(0,y+1,a,b,c-2,d));
       if(c < n)
            ans=min(ans,dfs(0,y+1,a,b,c+1,d));
       if(c < n-1)
            ans=min(ans,dfs(0,y+1,a,b,c+2,d));
       if(d > 1)
            ans=min(ans,dfs(0,y+1,a,b,c,d-1));
       if(d > 2)
            ans=min(ans,dfs(0,y+1,a,b,c,d-2));
       if(d < n)
            ans=min(ans,dfs(0,y+1,a,b,c,d+1));
       if(d < n-1)
            ans=min(ans,dfs(0,y+1,a,b,c,d+2));
   }
   else
   {
       if(a > 1)
            ans=max(ans,dfs(1,y+1,a-1,b,c,d));
       if(a < n)
            ans=max(ans,dfs(1,y+1,a+1,b,c,d));
       if(b > 1)
            ans=max(ans,dfs(1,y+1,a,b-1,c,d));
       if(b < n)
            ans=max(ans,dfs(1,y+1,a,b+1,c,d));
   }
   ++ans;
   f[x][y][a][b][c][d]=ans;
   return ans;
}
 
int main()
{
   scanf("%d%d%d%d%d",&n,&a,&b,&c,&d);
   if(abs(a-c)+abs(b-d)<=1)
        printf("WHITE 1\n");
   else
        printf("BLACK %d\n",dfs(0,0,a,b,c,d));
   return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值