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的主要内容,如果未能解决你的问题,请参考以下文章