BZOJ 3106: [cqoi2013]棋盘游戏(对抗搜索)

题目:http://www.lydsy.com/JudgeOnline/problem.php?id=3106

对抗搜索,f[x][y][a][b][c][d]表示当前谁走,走了几步,及位置。

(因为脑残+手残+眼拙写了一坨if还瞪了好久。。。最后还是这种做法靠谱。。。

#include<cstring>
#include<iostream>
#include<algorithm>
#include<cstdio>
#define maxn 109
#define rep(i,l,r) for (int i=l;i<=r;i++)
#define down(i,l,r) for (int i=l;i>=r;i--)
#define clr(x,y) memset(x,y,sizeof(x))
#define ll long long
#define inf int(1e9)
using namespace std;
int dx[8]={1,0,-1,0,2,0,-2,0};
int dy[8]={0,1,0,-1,0,2,0,-2};
int f[2][69][21][21][21][21];
int n,a,b,c,d; 
int read(){
    int x=0,f=1; char ch=getchar();
    while (!isdigit(ch)) {
        if (ch=='-') f=-1; ch=getchar();
    }
    while (isdigit(ch)){
        x=x*10+ch-'0'; ch=getchar();
    }
    return x*f;
}
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,xx=0,yy=0;
    if (x){
        ans=inf;
        rep(j,0,7) {
            xx=c+dx[j]; yy=d+dy[j];
            if (1<=xx&&xx<=n&&1<=yy&&yy<=n) ans=min(ans,dfs(0,y+1,a,b,xx,yy));
        }
    }   
    else {
        rep(j,0,3){
            xx=a+dx[j]; yy=b+dy[j];
            if (1<=xx&&xx<=n&&1<=yy&&yy<=n) ans=max(ans,dfs(1,y+1,xx,yy,c,d));
        }
    }
    ans++;
    f[x][y][a][b][c][d]=ans;
    return f[x][y][a][b][c][d]; 
}
int main(){
    n=read(); a=read(); b=read(); c=read(); d=read();
    if (abs(a-c)+abs(b-d)==1) puts("WHITE 1");
    else printf("BLACK %d",dfs(0,0,a,b,c,d));
    return 0;
}
原文地址:https://www.cnblogs.com/ctlchild/p/4995806.html