关闭

HDU1730->Nim博弈

标签: 游戏
97人阅读 评论(0) 收藏 举报
分类:

HDU1730->Nim博弈


题意:

游戏在一个n行m列(1 ≤ n ≤ 1000且2 ≤ m ≤ 100)的棋盘上进行,每行有一个黑子(黑方)和一个白子(白方)。执黑的一方先行,每次玩家可以移动己方的任何一枚棋子到同一行的任何一个空格上,当然这过程中不许越过该行的敌方棋子。双方轮流移动,直到某一方无法行动为止,移动最后一步的玩家获胜。
判断先手的胜负情况。

题解:

等效于nim博弈。
相当于n堆石子,每堆石子的数量等于每行黑白棋子间有多少个空格。如果全部都没有空格了,那么先走的必败,因为后走的可以贴着先走的棋子走,而对方一定在有限步之内穷途陌路,这时就相当于石子取完了。直观不同于nim的是,这里有可能通过反向移动,相当于增加石子,不过这也不会改变必胜必败态的。因为如果此时该走之人出于必胜态,那么就不必反向移动了,如果是必败态想通过增加石子改变必败态,那么另一方可以走相同的方向和步数来维持自己的必胜态,而耍赖一方的耍赖次数也是有限的。 到此模型就完全等价于nim游戏了。

代码:

#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#include <cmath>
using namespace std ;
int main()
{
    int m , n;
    while(scanf("%d%d" , &n , &m)==2)
    {
        int ans = 0 ;
        for(int i = 0 ; i < n ; i ++)
        {
            int a , b ;
            scanf("%d%d" , &a , &b) ;
            ans ^= (abs(a - b) - 1) ;
        }
        if(ans) printf("I WIN!\n") ;
        else printf("BAD LUCK!\n") ;
    }
    return 0 ;
}
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:18254次
    • 积分:1465
    • 等级:
    • 排名:千里之外
    • 原创:131篇
    • 转载:4篇
    • 译文:0篇
    • 评论:2条
    最新评论