CCF(棋局评估)博弈论+对抗搜索+DFS

Posted garrettwale

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CCF(棋局评估)博弈论+对抗搜索+DFS相关的知识,希望对你有一定的参考价值。

201803-4

棋局评估

这题主要使用对抗搜索,也就是每一步寻找可以下棋的位置,通过在这一步下棋看最后会取的什么样的分数。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
const int INF=0x3f3f3f3f;
int map[3][3];
bool row(int i,int p)return map[i][1]==p&&map[i][2]==p&&map[i][0]==p;
bool col(int j,int p)return map[0][j]==p&&map[1][j]==p&&map[2][j]==p;
bool tan(int p)
    if(map[0][0]==p&&map[1][1]==p&&map[2][2]==p)
        return true;
    else if(map[0][2]==p&&map[1][1]==p&&map[2][0]==p)
        return true;
    return false;

int calans()//计算空格有多少
    int ans=0;
    for(int i=0;i<3;i++)
        for(int j=0;j<3;j++)
            if(!map[i][j])
                ans++;
        
    
    return ans;

int grade(int p)//当前局面得分多少,p=1表示Alice,2表示Bob
    int ans=calans();
    ans+=1;
    bool flag=false;
    if(row(0,p)||row(1,p)||row(2,p))
        flag=true;
    if(col(1,p)||col(2,p)||col(0,p))
        flag=true;
    if(tan(p))
        flag=true;
    if(!flag)
        return 0;
    else
        return p==1?ans:-ans;
    

int dfs(int p)//现在下棋的是p
    if(calans()==0)
        return 0;
    int maxs=-INF;
    int mins=INF;
    for(int i=0;i<3;i++)
        for(int j=0;j<3;j++)
            if(!map[i][j])//如果这里是空格,可以下棋
                map[i][j]=p;
                int gra=grade(p);
                if(gra!=0)//这里已经可以判断胜负了
                    map[i][j]=0;
                    return gra>0?max(maxs,gra):min(mins,gra);
                
                if(p==1)//当前是Alice
                    maxs=max(maxs,dfs(2));
                else//当前是Bob
                    mins=min(mins,dfs(1));
                
                map[i][j]=0;
            
        
    
    if(p==1)
        return maxs;
    return mins;

int main()
    int t;
    cin>>t;
    while(t--)
        for(int i=0;i<3;i++)
            for(int j=0;j<3;j++)
                cin>>map[i][j];
            
        
        int gra1=grade(1);
        int gra2=grade(2);
        if(gra1)
            cout<<gra1<<endl;
            continue;
        
        if(gra2)
            cout<<gra2<<endl;
            continue;
        
        cout<<dfs(1)<<endl;
    
    //system("pause");
    return 0;

以上是关于CCF(棋局评估)博弈论+对抗搜索+DFS的主要内容,如果未能解决你的问题,请参考以下文章

CCF201803-4棋局评估,对抗搜索,极大极小算法

CCF棋局评估

CCF 201803-4 棋局评估 (对抗搜索)

CCF-棋局评估 201803-04(版本 2.0)------(之前写了一个臃肿的1.0版 ,还沾沾自喜 233)

对抗搜索

开始报名丨CCF C³-13@奇安信:透视俄乌网络战 —— 网络空间基础设施面临的安全对抗与制裁博弈...