博弈 HDU - Nim or not Nim?
2018-01-23 13:44
483 查看
题目简介:
经典Nim博弈游戏变换,给你n堆石子pi,每堆有pi个石子,
Alice和Bob轮流取石子,每次可以从任意一堆中拿走任意个石子,也可以将某一堆石子分成两个小堆
思路:SG函数打表找规律;
分析:
对于一堆石子x;
x = 0,SG[ 0 ] = 0;
x = 1,SG[ 1 ] = 1;
x = 2,则其后继状态为 0,1 ,(1,1),则其SG函数为 0, 1, 0;则SG[ 2 ] = 2;
x = 3,则其后继状态为 0,1,2 ,(1,2),则其SG函数为 0, 1, 2, 3;则SG[ 3 ] = 4;
x = 4,则其后继状态为 0,1,2,3 ,(1,3),(2,2)则其SG函数为 0, 1, 2,4,5,0;则SG[ 4 ] = 3;
则用SG函数打表,我们看看有什么规律;
附上代码:
![](https://img-blog.csdn.net/20180123132759696?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2VpeGluXzM5NzkyMjUy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
我们可以看出规律:
若 n % 4 == 0; SG[ n ] = n - 1;
若 n % 4 == 3;SG[ n ] = n + 1;
否则 SG[ n ] = n;
最后附上解题代码:
题目链接:HDU 3032
经典Nim博弈游戏变换,给你n堆石子pi,每堆有pi个石子,
Alice和Bob轮流取石子,每次可以从任意一堆中拿走任意个石子,也可以将某一堆石子分成两个小堆
思路:SG函数打表找规律;
分析:
对于一堆石子x;
x = 0,SG[ 0 ] = 0;
x = 1,SG[ 1 ] = 1;
x = 2,则其后继状态为 0,1 ,(1,1),则其SG函数为 0, 1, 0;则SG[ 2 ] = 2;
x = 3,则其后继状态为 0,1,2 ,(1,2),则其SG函数为 0, 1, 2, 3;则SG[ 3 ] = 4;
x = 4,则其后继状态为 0,1,2,3 ,(1,3),(2,2)则其SG函数为 0, 1, 2,4,5,0;则SG[ 4 ] = 3;
则用SG函数打表,我们看看有什么规律;
附上代码:
//SG[]:0~n的SG函数值 //S[]:为x后继状态的集合 int SG[MAXN],S[MAXN]; void getSG(int n){ int i,j; memset(SG,0,sizeof(SG)); SG[0] = 0; for(i = 1; i <= n; i++){ memset(S,0,sizeof(S)); for(j = 0; j < i; j++) S[SG[j]] = 1; for(j = 0; j < i; j++) S[(SG[j]^SG[i-j])] = 1; for(j = 0;; j++) if(!S[j]){ SG[i] = j; break; } } }
我们可以看出规律:
若 n % 4 == 0; SG[ n ] = n - 1;
若 n % 4 == 3;SG[ n ] = n + 1;
否则 SG[ n ] = n;
最后附上解题代码:
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<cmath> using namespace std; /** 2018/1/23 已完成; **/ int t,n; long long G(long long c) { 4000 if(c % 4 == 0) return c-1; else if(c % 4 == 3) return c + 1; else return c; } int main() { scanf("%d",&t); while(t--) { scanf("%d",&n); long long s = 0,c; while(n--) { scanf("%lld",&c); s ^= G(c); } if(s == 0) puts("Bob"); else puts("Alice"); } return 0; }
题目链接:HDU 3032
相关文章推荐
- HDU 3032 Nim or not Nim?(博弈 SG打表找规律)
- HDU 2311-Nim or not Nim?(Nim博弈-打sg表找规律)
- HDU 3032 Nim or not Nim? (博弈之求SG函数)
- HDU 3032 Nim or not Nim?(博弈,SG打表找规律)
- HDU 3032 (Nim博弈变形) Nim or not Nim?
- hdu 3032 Nim or not Nim? 博弈(SG定理+找规律)
- (HDU 3032) Nim or not Nim(SG函数、博弈)
- HDU 3032 Nim or not Nim?(博弈,打表找规律)
- hdu 3032 Nim or not Nim? (SG函数+打表)
- HDU 3032 - Nim or not Nim?(SG)
- HDU 3032 Nim or not Nim?(Multi_SG,打表找规律)
- HDU 5978 To begin or not to begin (简单博弈--找规律)
- HDU - 3032 Nim or not Nim?
- HDU 3032 Nim or not Nim?(Multi-Nim)
- HDU 3032 Nim or not Nim?
- hdu 3032 Nim or not Nim? 博弈论
- HDU 3032-Nim or not Nim?(sg函数打表)
- hdu 3032 Nim or not Nim? (SG,然后找规律)
- hdu 3032 Nim or not Nim? (SG函数+打表)
- HDU 3032 Nim or not Nim? (sg函数求解)