博弈论 (入门)CSU2209 记忆化搜索

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/DADDY_HONG/article/details/84928732

2209: Game

Submit Page    Summary    Time Limit: 1 Sec     Memory Limit: 256 Mb     Submitted: 10     Solved: 5    


Description

xrdog有一个有趣的算式 a^X+b*Y^2≥C

现给定a,b和c,且初始的时候X=Y=0,xrdog和小砖准备玩一个游戏。游戏规则是这样子的:

Xrodg和小砖轮流进行操作,xrdog进行第一次操作。 每一次操作xrdog或小砖可以选择把X加一,或者把Y加一。如果某人操作完后使得算式成立了,那么此人就输了。 小砖现在想知道她是否能赢呢,你能帮帮她吗?

(注意:xrdog和小砖都无比聪明,他们都会选择最优策略)

Input

一行三个非负整数(a≤10^3),b(b≤10^3)和 c(2≤c≤10^9)

Output

若小砖能赢输出1

若小砖无法取胜输出0

若是平局(即不会有人失败)则输出-1

Sample Input

2 2 2

Sample Output

1

博弈论入门题目,想想能得出。

xrdog操作时,只有x+1或y+1都无法得到胜局时才是小砖的胜局。否则先手必胜。

而小砖操作时,只要x+1或y+1能有得到胜局的,就是小砖的胜局。

超时了一发,蠢了只用了暴力dfs,应记忆化搜索,有些是进行了重复的计算。

WA了一发,条件没有想清楚,如果a==1或者a==0或者b==0,均能够一直加x或y而不增加算式的值,此时无法分出胜负。

#include <cstdio>
#include <cstring>
#include <cmath>

const int maxn=1e3+10;

long long a,b,c;
long long z;
int flag[maxn][maxn];

//记忆化搜索
bool dfs(int x,int y,int cnt)
{
    if(flag[x][y]!=-1){
        return flag[x][y];
    }
    if(pow(a,x)+b*y*y>=c){
        flag[x][y]=0|(cnt%2);
        return flag[x][y];
    }
    else{
        if(cnt%2==1){
            return flag[x][y]=dfs(x+1,y,cnt+1)&&dfs(x,y+1,cnt+1);
        }
        else{
            return flag[x][y]=dfs(x+1,y,cnt+1)||dfs(x,y+1,cnt+1);
        }

        return 0;
    }
}

int main()
{
    memset(flag,-1,sizeof(flag));

    scanf("%lld%lld%lld",&a,&b,&c);
    z=c;
    if(a<=1||b==0){ //!
        printf("-1\n");
    }else{
        if(dfs(0,1,1)&&dfs(1,0,1)){
            printf("1\n");
        }
        else printf("0\n");
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/DADDY_HONG/article/details/84928732