带一个圆环的尼姆博弈

题目:hdu3980

题意:有一串含有n个珠子的链子。每个人每次只能给相邻的m个珠子涂色。谁先不能涂了谁就输了。

解答:重点:第一个人涂完之后它就变成了一条直线。然后每次在直线中选m个连续的涂完剩下两条抑或一下就行。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int MAXN = 1010;
int sg[MAXN];
int n,m;
int getsg(int a)
{
    if(sg[a] != -1)
        return sg[a];
    if(a < m)
        return 0;
    int vis[MAXN];
    memset(vis,0,sizeof(vis));
    for(int i = 0;i <= a-m;i++)
    {
        vis[getsg(i) ^ getsg(a-m-i)] = 1;
    }
    for(int i = 0;;i++)
    {
        if(!vis[i])
        {
            sg[a] = i;
            return i;
        }
    }
}
int main()
{
    int T;
    scanf("%d",&T);
    for(int i = 1;i <= T;i++)
    {
        cin >> n >> m;
        cout << "Case #" << i << ": ";
        memset(sg,-1,sizeof(sg));
        if(n < m || getsg(n - m) != 0)
            puts("abcdxyzk");
        else
            puts("aekdycoin");
    }
    return 0;
}


尼姆博弈是一种经典的数学博弈游戏,通常由两玩家进行。每个玩家轮流从一堆物品中取走任意数量的物品,最后一个取走物品的玩家获胜。为了编写一个尼姆博弈的代码,我们需要实现以下功能: 1. **初始化游戏**:定义初始的物品数量。 2. **玩家轮流取物品**:每个玩家可以选择从一堆物品中取走任意数量的物品。 3. **判断胜利条件**:当所有物品被取完时,最后一个取走物品的玩家获胜。 下面是一个简单的Python代码示例,展示了如何实现尼姆博弈: ```python def nim_game(piles): """ Nim游戏的主函数 :param piles: 初始的物品堆,每堆的物品数量 :return: 胜利的玩家,1或2 """ current_player = 1 while True: print(f"当前堆状态: {piles}") print(f"玩家 {current_player} 的回合") move = get_player_move(piles) piles = update_piles(piles, move) if is_game_over(piles): print(f"玩家 {current_player} 获胜!") break current_player = switch_player(current_player) def get_player_move(piles): """ 获取玩家的移动 :param piles: 当前堆的状态 :return: 玩家的移动,列表形式 """ while True: try: move = list(map(int, input("请输入你要取的每堆物品数量,用空格分隔: ").split())) if len(move) != len(piles): print(f"请输入 {len(piles)} 个数字") continue if any(x < 0 or x > pile for x, pile in zip(move, piles)): print("无效的输入,请重新输入") continue return move except ValueError: print("请输入有效的数字") def update_piles(piles, move): """ 更新堆的状态 :param piles: 当前堆的状态 :param move: 玩家的移动 :return: 更新后的堆的状态 """ return [pile - move[i] for i, pile in enumerate(piles)] def is_game_over(piles): """ 判断游戏是否结束 :param piles: 当前堆的状态 :return: 布尔值 """ return all(pile == 0 for pile in piles) def switch_player(current_player): """ 切换当前玩家 :param current_player: 当前玩家 :return: 切换后的玩家 """ return 2 if current_player == 1 else 1 if __name__ == "__main__": initial_piles = list(map(int, input("请输入每堆物品的初始数量,用空格分隔: ").split())) nim_game(initial_piles) ``` 这个代码实现了以下功能: 1. 初始化游戏:用户输入每堆物品的初始数量。 2. 玩家轮流取物品:每个玩家输入要取走的每堆物品数量。 3. 判断胜利条件:当所有物品被取完时,游戏结束,最后一个取走物品的玩家获胜。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值