hdu 2873 二维SG

本文介绍了一款名为“BombGame”的数学博弈游戏,详细解释了游戏规则,并提供了一个使用SG函数解决该游戏的C++代码示例。通过分析初始棋盘状态来预测最终胜利者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Bomb Game

John and Jack, two mathematicians, created a game called “Bomb Game” at spared time. This game is played on an n*m chessboard. A pair of integers (p, q) represents the grid at row p, column q. Some bombs were placed on the chessboard at the beginning. Every round, a player can choose to explode a bomb located at (p, q), and the exploded bomb will disappear. Furthermore: 

1.If p>1 and q>1, the bomb will split up into two bombs located at (u, q) and (p, v), u<p, v<q, u and v are chosen by the player. 
2.If p=1 and q>1, one new bomb will be produced, located at (p, v), v<q, v can be chosen freely by the player. 
3.If q=1 and p>1, one new bomb will be produced, located at (u, q), u<p, u can be chosen freely by the player. 


If two bombs located at the same position or a bomb located at (1, 1), they will be exploded automatically without producing new bombs. 
Two players play in turn, until one player cannot explode the bombs and loses the game. 
John always plays first. 
Now, we’ll give you an initial situation, and you should tell us who will win at last. Assume John and Jack are smart enough, and they always do the best choice.
InputThere are several test cases, each one begins with two integers n and m, 0<n, m<=50, represents the number of rows and columns. Following by an n*m grid, describing the initial situation, ‘#’ indicates bomb. 
The input is terminated by n=m=0.OutputFor each test case, output one line, the name of the winner.Sample Input
2 2
.#
..
2 2
.#
.#
0 0
Sample Output
John
Jack

#是炸弹,引爆一个炸弹会在它的左边和上边产生新的炸弹,边界就不会了。(1,1)的炸弹不能引爆,John是先手,谁不能引爆炸弹就输了。

很典型的SG函数模板题,不过是二维的。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int N = 55;
 4 int sg[N][N], mex[N*100], n, m;
 5 char ch;
 6 int SG(int x, int y) {
 7     memset(mex, 0, sizeof(mex));
 8     for(int i = 0; i < x; i ++) {
 9         for(int j = 0; j < y; j ++) {
10             mex[sg[x][j]^sg[i][y]] = 1;
11         }
12     }
13     for(int i = 0; ; i ++) if(!mex[i]) return i;
14 }
15 int main() {
16     for(int i = 0; i < N; i ++) sg[0][i] = sg[i][0] = i;
17     for(int i = 1; i < N; i ++) {
18         for(int j = 1; j < N; j ++) {
19             sg[i][j] = SG(i,j);
20         }
21     }
22     while(cin >> n >> m, n, m) {
23         int ans = 0;
24         for(int i = 0; i < n; i ++) {
25             for(int j = 0; j < m; j ++) {
26                 cin >> ch;
27                 if(ch == '#') ans ^= sg[i][j];
28             }
29         }
30         printf(ans?"John\n":"Jack\n");
31     }
32     return 0;
33 }

 

转载于:https://www.cnblogs.com/xingkongyihao/p/9113537.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值