NYOJ 837 Wythoff Game

Wythoff Game

時間限制:1000 ms  |  內存限制:65535 KB
難度:1
描述

最近ZKC同學在學博弈,學到了一個偉大的博弈問題--威佐夫博弈。
相信大家都學過了吧?沒學過?沒問題。我將要爲你講述一下這個偉大的博弈問題。
有兩堆石子,數量任意,可以不同。遊戲開始由兩個人輪流取石子。
遊戲規定,每次有兩種不同的取法:
一是可以在任意的一堆中取走任意多的石子;
二是可以在兩堆中同時取走相同數量的石子。
最後把石子全部取完者爲勝者。
我們今天要做的是求前n個必敗態。
什麼是必敗態?比如我們把(a,b)稱爲一種狀態,a,b分別爲兩堆石子中所剩的數目。如果a=0,b=0,我們說該種狀態爲必敗態,因爲我不能再進行遊戲,即使是可以進行,那也是必敗的,你知道,遊戲的我們都是非常聰明的。(0,0)(1,2)(3,5)...都是必敗態,我們今天要做的就是求前n個必敗態。不會?好吧!
我再告訴你:假設第n個必敗態爲(a,b)a爲前n-1個必敗態中沒有出現的最小自然數,b=a+n。這下大家應該明白了吧。好吧,我們的任務就的要前n個必敗態。規定第0個必敗態爲(0,0)。

輸入
多組數據。
輸入爲一個數n(0<=n<=100000)。
輸出
按照要求求出前n個必敗態。輸出格式看下面樣例。
樣例輸入
3
1
樣例輸出
(0,0)(1,2)(3,5)(4,7)
(0,0)(1,2)
提示
注意:每種情況中間沒有空格
來源

原創

威佐夫博奕基礎

#include<iostream>
#include<cstdlib>
#include<cstring>
#define MAX 100005
using namespace std;
int visit[MAX];
int main(){
	int N;
	while(cin>>N){
		int a[MAX],b[MAX];
		memset(visit,0,sizeof(visit));
		a[0]=0,b[0]=0;
		visit[0]=1;
		for(int i=1;i<=N;i++){
			for(int j=0;j<MAX;j++){
				if(!visit[j]){
					visit[j]=1;
					a[i]=j;
					b[i]=j+i;
					visit[j+i]=1;
					break;
				}
			}
		}
		for(int i=0;i<=N;i++){
			cout<<"("<<a[i]<<","<<b[i]<<")";
		}
		cout<<endl;
	}
} 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章