http://acm.hdu.edu.cn/showproblem.php?pid=4155
搜索博弈
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int card[8];
char s[30];
int dfs(int sum) // 用来判断判断当前局面即和为sum是否为胜局
{
if(sum==31) return 1; // 剪枝,如果为31 当然为胜局
for(int i=1;i<=6;i++)
if(card[i]&&sum+i<=31) 是否为胜局要经的住对手的检验,即对手可能出任何当前可能出的牌,如果其子局面全为败局的话,才为胜局
{
card[i]--;
//cout<<sum+i<<endl;
int tt=dfs(sum+i);
//cout<<tt<<endl;
card[i]++;
if(tt) return 0;
}
return 1; //全为败局
}
int main()
{
while(scanf("%s",s)==1)
{
printf("%s ",s);
int sum=0;
for(int i=1;i<7;i++)
card[i]=4;
int n=strlen(s);
for(int i=0;i<n;i++)
{
sum+=s[i]-'0';
card[s[i]-'0']--;
}
if(sum>=31)
{
puts(n%2?"A":"B");
}
else
{
if(dfs(sum))
puts(n%2?"A":"B");
else
puts(n%2?"B":"A");
}
}
return 1;
}