Problem A
极大极小搜索
时限:1000ms 内存限制:10000K 总时限:3000ms
描述:
搜索n层,第一层取最大值,先输入两个整数n、randseed,用randseed设置随机数种子。
搜索时每层4个分支,能不能想这个分支走用函数canmoveto()判断,内容如下:
int canmoveto(int m, int dire)
{
return(rand() % 2);
}
评估函数用
int evaluation()
{
return(rand() % 21 - 10);
}
输入:
先输入两个整数n、randseed,
输出:
输出用极大极小搜索n层后的返回的最优值。
输入样例:
6 1234
输出样例:
2
代码(借鉴老师上课所写)
#include<stdio.h>
#include<stdlib.h>//调用随机数函数所需的头文件
int n;
int canmoveto(int m, int dire);
int evaluation();
int dfs(int m,int mark);
int main()
{
int randseed;
int num;
scanf("%d%d",&n,&randseed);
srand(randseed);//生成随机数
num=dfs(n,1);
printf("%d\n",num);
}
int dfs(int m,int mark)//深搜函数
{
int i;
int maxvalue=-10;
int value;
if(m==0)
{
return evaluation();
}//评估并返回
else
{
//找出所走的棋中最好的一步 返回最优值
for(i=0;i<4;i++)
{
if(canmoveto(m,i))
{
value=dfs(m-1,mark*(-1));
if(value*mark>maxvalue)
{
maxvalue=value*mark;
}
}
}
}
return maxvalue*mark;
}
int canmoveto(int m, int dire)//判断函数
{
return(rand() % 2);
}
int evaluation()//评估函数
{
return(rand() % 21 - 10);
}