CCF 201803-4 棋局评估

博弈论之前还没学到。。。

不会啊这题

参考了一篇博客:https://blog.csdn.net/xbb224007/article/details/79935167

#include<bits/stdc++.h>

using namespace std;

int mp[3][3];

bool hang(int i,int f){
    return mp[i][0]==f&&mp[i][1]==f&&mp[i][2]==f;
}

bool lie(int j,int f){
    return mp[0][j]==f&&mp[1][j]==f&&mp[2][j]==f;
}

bool duijiao(int f){
    if(mp[0][0]==f&&f==mp[1][1]&&f==mp[2][2]) return 1;
    if(mp[0][2]==f&&f==mp[1][1]&&f==mp[2][0]) return 1;
    return 0;
}

int spa(){
    int res=0;
    for(int i=0;i<3;i++){
        for(int j=0;j<3;j++){
            if(!mp[i][j]) res++;
        }
    }
    return res;
}

int win(int f){
    bool w=0;
    if(hang(0,f)||hang(1,f)||hang(2,f)) w=1;
    if(lie(0,f)||lie(1,f)||lie(2,f)) w=1;
    if(duijiao(f)) w=1;
    if(!w) return 0;
    int ans=spa()+1;
    return (f==1)?ans:-ans;
}

int dfs(int f){
    if(!spa()) return 0;
    int Max=-10,Min=10;
    for(int i=0;i<3;i++){
        for(int j=0;j<3;j++){
            if(!mp[i][j]){
                mp[i][j]=f;
                int w=win(f);
                if(w){
                    mp[i][j]=0;
                    return w>0?max(Max,w):min(Min,w);
                }
                if(f==1){
                    Max=max(Max,dfs(2));
                }else Min=min(Min,dfs(1));
                  mp[i][j]=0;
            }
        }
    }
    return f==1?Max:Min;
}

int main(){
    int n;
    scanf("%d",&n);
    while(n--){
        for(int i=0;i<3;i++){
            for(int j=0;j<3;j++){
                scanf("%d",&mp[i][j]);
            }
        }
        if(win(1)){
            cout<<win(1)<<endl;
            continue;
        }
        if(win(2)){
            cout<<win(2)<<endl;
            continue;
        }
        cout<<dfs(1)<<endl;
    }
    return 0;
}

猜你喜欢

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