1. 程式人生 > >簡單博弈 nyoj 取球遊戲

簡單博弈 nyoj 取球遊戲

取球遊戲
時間限制:1000 ms | 記憶體限制:65535 KB
描述
今盒子裡有n個小球,A、B兩人輪流從盒中取球,每個人都可以看到另一個人取了多少個,也可以看到盒中還剩下多少個,並且兩人都很聰明,不會做出錯誤的判斷。

我們約定:
每個人從盒子中取出的球的數目必須是:1,3,7或者8個。

輪到某一方取球時不能棄權!

A先取球,然後雙方交替取球,直到取完。

被迫拿到最後一個球的一方為負方(輸方)


請程式設計確定出在雙方都不判斷失誤的情況下,對於特定的初始球數,A是否能贏?

輸入
先是一個整數n(n<100),表示接下來有n個整數。然後是n個整數,每個佔一行(整數<10000),表示初始球數。
輸出
程式則輸出n行,表示A的輸贏情況(輸為0,贏為1)。
樣例輸入
4
1
2
10
18
樣例輸出
0
1
1
0
這裡規定最後一個取走1個的輸,其實和麵對不能取的局面的做法是一樣的。
我們只需要把球數-1,就和一般的誰取走最後的石子就贏一樣。
(P為必敗態, N為必勝利態)

1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  21  22  23 ...
0  1  2  3  4  5  6  7  8  9   10  11  12  13  14  15  16  17  18  19  20  21  22...
P  N  P  N  P  N  P  N  N  N   N   N   N   N   N   N   P   N   P   N   P   N   P ...

這裡不難發現15一迴圈,就這樣子。

#include<iostream>
#include<cstring>
#include<cstdlib> #include<algorithm> #include<cctype> #include<cmath> #include<ctime> #include<string> #include<stack> #include<deque> #include<queue> #include<list> #include<set> #include<map> #include<cstdio> #include<limits.h>
#define MOD 1000000007 #define fir first #define sec second #define fin freopen("/home/ostreambaba/文件/input.txt", "r", stdin) #define fout freopen("/home/ostreambaba/文件/output.txt", "w", stdout) #define mes(x, m) memset(x, m, sizeof(x)) #define Pii pair<int, int> #define Pll pair<ll, ll> #define INF 1e9+7 #define Pi 4.0*atan(1.0) #define lowbit(x) (x&(-x)) #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define scin(n) scanf("%d", &n) #define scout(n) printf("%d\n", n); typedef long long ll; typedef unsigned long long ull; const double eps = 1e-6; const int maxn = 50010; using namespace std; int main() { int Case; scin(Case); while(Case--){ int n; scin(n); if(1 == n%15 || 3 == n%15 || 5 == n%15 || 7 == n%15){ scout(0); } else{ scout(1); } } return 0; }