簡單博弈 nyoj 取球遊戲
阿新 • • 發佈:2019-01-28
取球遊戲
時間限制: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;
}