POJ 2068 Nim (记忆化搜索+组合博弈)

来源:互联网 发布:naca4412翼型数据 编辑:程序博客网 时间:2024/06/05 09:06

题意:S个石头,双方n个人,每个人最多可以一次拿Si个石头,问先手有没有必胜策略

思路:记忆化搜素+组合博弈。(枚举出所有的情况)

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define N 30#define M 10000using namespace std;int f[N][M],a[N],n,m;// 1为败 0为胜int dfs(int x,int y){if(f[x][y]!=-1)  return f[x][y];    //判断是否经历过for(int i=max(0,y-a[x]);i<y;i++)    // 记忆化搜索枚举剩多少石子if(!dfs((x+1)%n,i))             // 如果是后一点N态,则当前点P态         return f[x][y]=1;             return f[x][y]=0;             //  如果后一点全都是P态,则当前点为N点}int main(){while(scanf("%d",&n)==1&&n!=0){n<<=1;scanf("%d",&m);for(int i=0;i<n;i++)   scanf("%d",&a[i]);memset(f,-1,sizeof(f));for(int i=0;i<n;i++)   f[i][0]=1;if(dfs(0,m))    puts("1");else      puts("0");}}


原创粉丝点击