POJ 3537 Nim游戏

 2023-09-10 阅读 20 评论 0

摘要:链接: http://poj.org/problem?id=3537 题意: 有个2人玩的游戏在一个规模为1*n的棋盘上进行,每次一个人选择一个地方画上’X’,一旦某个人画上X后出现了连续3个X,那么这个人就赢了。 题解: poj1208、仔细思考一下我们发现,xxx的

链接:

http://poj.org/problem?id=3537

题意:

有个2人玩的游戏在一个规模为1*n的棋盘上进行,每次一个人选择一个地方画上’X’,一旦某个人画上X后出现了连续3个X,那么这个人就赢了。

题解:

poj1208、仔细思考一下我们发现,xxx的上一步只能是oxx,xox,xxo的其中一种,也就是说如果谁走出一步形成上述局面那么谁就必败。 
再进一步说,如果你在第i个格子画x,那么i-1,i-2,i+1,i+2,都不可以画x,因为那样会必败。 
这样题目就可以转化为,轮流画x,谁没有格子画x谁就输。 
以上例来进行一下计算,假设N为3,也就是OOOO,当前局面有4个子局面,XOOO,OXOO,OOXO,OOOX。 
1. XOOO对于当前玩家只有一步可走,就是XOOX(别忘了上面说过每走一步,该位置左右共4个位置都不能),所以XOOO就是一个N-position局面(后手输)。 
2. OXOO对于当前玩家无步可走,所以是一个P-position(先手输)。 
3. 4. OOXO,OOOX就不再赘述,前者P,后者N。 

那么OOOO显然是一个N-position,因为他的子局面中有P-position(他当然会把这种局面留给自己的对手)。

根据上面这个过程,可以得到一个递归的算法——对于当前的局面,递归计算它的所有子局面的性质,如果存在某个子局面是P-position,那么向这个子局面的移动就是必胜策略。

代码:

 1 #include <map>
 2 #include <set>
 3 #include <cmath>
 4 #include <queue>
 5 #include <stack>
 6 #include <cstdio>
 7 #include <string>
 8 #include <vector>
 9 #include <cstdlib>
10 #include <cstring>
11 #include <sstream>
12 #include <iostream>
13 #include <algorithm>
14 #include <functional>
15 using namespace std;
16 #define rep(i,a,n) for (int i=a;i<n;i++)
17 #define per(i,a,n) for (int i=n-1;i>=a;i--)
18 #define all(x) (x).begin(),(x).end()
19 #define pb push_back
20 #define mp make_pair
21 #define lson l,m,rt<<1  
22 #define rson m+1,r,rt<<1|1 
23 typedef long long ll;
24 typedef vector<int> VI;
25 typedef pair<int, int> PII;
26 const ll MOD = 1e9 + 7;
27 const int INF = 0x3f3f3f3f;
28 const int MAXN = 2010;
29 // head
30 
31 int sg[MAXN];
32 
33 int get_sg(int n) {
34     if (n <= 0) return 0;
35     if (sg[n] != -1) return sg[n];
36     bool f[MAXN] = {};
37     rep(i, 1, n + 1) f[get_sg(i - 3) ^ get_sg(n - i - 2)] = 1;
38     for (int i = 0;; i++) if (!f[i]) return sg[n] = i;
39 }
40 
41 int main() {
42     int n;
43     memset(sg, -1, sizeof(sg));
44     while (cin >> n) {
45         if (get_sg(n)) cout << 1 << endl;
46         else cout << 2 << endl;
47     }
48     return 0;
49 }

poj1741? 

转载于:https://www.cnblogs.com/baocong/p/6751991.html

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/5/33027.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息