poj 2068 Nim

Nim

 POJ - 2068 

题目大意:多组数据,两人轮流操作,n轮一循环,给出总石子数和这n轮每次两人能取的石子上限(下限为1)。取到最后一颗者输。

/*
    f[i][j]表示在第i轮中一共有j个石子,先行者是否必胜
    由于是取到最后一个的人输,那么如果一个石子都没有,先行者必胜,则f[i][0]初始化为1 
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 10010
using namespace std;
int f[21][maxn],a[21],n,s;
int dfs(int pos,int s){
    if(pos>n)pos=1;
    if(f[pos][s]!=-1)return f[pos][s];
    for(int i=1;i<=min(a[pos],s);i++){
        int t=s-i;
        if(!dfs(pos+1,t))return f[pos][s]=1;
    }
    return f[pos][s]=0;
}
int main(){
    while(1){
        scanf("%d",&n);n*=2;
        if(n==0)return 0;
        scanf("%d",&s);
        for(int i=1;i<=n;i++)scanf("%d",&a[i]);
        memset(f,-1,sizeof(f));
        for(int i=1;i<=n;i++)f[i][0]=1;
        int ans=dfs(1,s);
        if(ans)puts("1");
        else puts("0");
    }
    return 0;
}

 

posted @ 2017-12-28 11:26  Echo宝贝儿  阅读(137)  评论(0编辑  收藏  举报