HDU 2188 博弈 + sg打表

xiaoxiao2021-02-28  111

博弈 + sg打表

只要当前状态可以转移到的状态中有一个是败态,那么当前状态就是胜态。如果当前状态可以转移到的所有状态都是胜态,那么当前状态就是败态。

题意:

​ 两个人玩加法游戏,谁先加到>= n,谁胜利,每次每一个人只能加1~m区间的数字。

​ 利用第二条性质,可以直接打出表。博弈真是一个妖怪!换了一道题,我竟然还用原来的方法,看来未得真谛,所以要多多思考,当前局面和必败局和必胜局的关系。

#include <iostream> #include <cstdio> #include <cstring> #include <set> using namespace std; const int maxn = 10105; int n,m; int sg[maxn]; void SG() { sg[0] = 0; for(int i = 0;i <= n; i++) { if(sg[i] == 0) { for(int j = 1;j <= m; j++) { sg[i+j] = true; } } } } int main() { //freopen("in.txt","r",stdin); int t; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); memset(sg,0,sizeof(sg)); SG(); if(sg[n]) printf("Grass\n"); else printf("Rabbit\n"); } return 0; }
转载请注明原文地址: https://www.6miu.com/read-26086.html

最新回复(0)