博弈综合

原创 2016年08月30日 21:38:51

题目:hdu5754

题意有4种操作分别是:
1.king.每次横或者竖或者斜只能走一步
2.rook(castle).每次横或者竖能走若干步
3.knight.每步先横(竖)走一格,再斜走一格。或者每步先斜走一格,再横(竖)走一格
4.queen.每次横或竖或斜走若干步
然后这些操作对应的是国际象棋里面的一些操作(具体操作可以百度) 然后现在我们站在(1,1)点,要去往(N,M)点,按照国际象棋操作的时候只能往右或者往下走,然后有两个人进行按照规则进行操作,谁最先到达(N,M)点谁就胜出。

解答:1、再想想吧。有人说是巴什博弈?或者根据博弈的规律推?

          2、走到终点的时候,恰好横着走了m-1步,竖着走了n-1步。所以这个问题就可以转化为有两堆石子的Nim游戏。谁先拿完这两堆棋子谁就就赢。(两堆石子的数量为n-1和m-1)。

          3、这个每走一次相当于从一堆石子里面拿两个,从另一堆石子里面拿一个。如果石子的和不是3的倍数很显然不能拿完。

如果是,如果两个石子数目相同,那么先手必败,因为第一个人从第一个里面拿一个第二个里面拿两个,你就从第二个里面拿一个从第一个里面拿两个,石子数目仍然相同,最后拿没了。如果两堆石子的差为1的话,第一个人拿完让他们相等就到了奇异局势。

其他的情况,一个人想办法变成奇异局势另外一个人肯定会阻止最后的结果就是平局。

          4、也把它转化为两堆石子。两个人可以任选一堆拿一个,或者两堆同时拿一样数目的石子,谁先拿完谁赢。哦这就是典型的威佐夫博弈。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int main()
{
    int T,k,m,n;
    scanf("%d",&T);
    while(T--)
    {
        int ans = 1;//先手赢
        scanf("%d%d%d",&k,&m,&n);
        if(k == 1)
        {
            if((m&1)&&(n&1))
                ans = 0;
        }
        else if(k == 2)
        {
            if(((n-1)^(m-1)) == 0)
                ans = 0;
        }
        else if(k == 3)
        {
            n--;
            m--;
            if((m+n)%3)
                ans = 2;
            else if(m == n)
                ans = 0;
            else if(m == n+1 || n == m+1)
                ans = 1;
            else
                ans = 2;
        }
        else if(k == 4)
        {
            m--;
            n--;
            if(m > n)
            {
                int t = m;
                m = n;
                n = t;
            }
            int tmp = floor((n - m) * (sqrt(5.0)+1)/2);
            if(tmp == m)
                ans = 0;
        }
        if(ans == 0)
        puts("G");
        else if(ans == 1)
        puts("B");
        else if(ans == 2)
        puts("D");
    }
    return 0;
}



          

         

版权声明:本文为博主原创文章,未经博主允许不得转载。

博弈-Nim博弈

Nim博弈
  • wximo
  • wximo
  • 2014年05月13日 11:19
  • 814

博弈问题之三大博弈

一.巴什博奕(Bash Game): 首先我们来玩一个比较古老的报数游戏。A和B一起报数,每个人每次最少报一个,最多报4个。轮流报数,看谁先报到30. 如果不知道巴什博弈的可能会觉得这个是个有运气...
  • Roosevelty
  • Roosevelty
  • 2015年02月19日 09:42
  • 558

各种博弈问题

(一)巴什博奕(Bash Game):只有一堆n个物品,两个人轮流从这堆物品中取物,规 定每次至少取一个,最多取m个。最后取光者得胜。     显然,如果n=m+1,那么由于一次最多只能取m个,所以...
  • qq_26437925
  • qq_26437925
  • 2016年08月02日 11:09
  • 713

计算机博弈大赛参赛程序算法总结

背景前两年的全国计算机博弈大赛的爱恩斯坦棋棋种赛我都有参加。14年采用的是极大极小算法,那个时候还不太懂搜索算法的优化,所以算法就是最原始的极大极小搜索,没有做任何剪枝。15年我在上一年的算法基础上加...
  • spenghui
  • spenghui
  • 2016年06月21日 21:47
  • 3928

博弈题目集锦

首先当然要献上一些非常好的学习资料:基础博弈的小结:http://blog.csdn.net/acm_cxlove/article/details/7854530经典翻硬币游戏小结:http://bl...
  • feizaoSYUACM
  • feizaoSYUACM
  • 2017年02月02日 12:51
  • 336

枪手博弈

枪手博弈 三人同时开枪 三人轮流开枪
  • Vitalia
  • Vitalia
  • 2017年01月12日 17:23
  • 673

ACM博弈学习小结

1.ACM博弈题,不会的时候觉得难于上青天,会的时候觉得没有比博弈更水的题了; 博弈题看到的第一眼觉得是难题,代码敲完顿觉水题。你可能花半个小时去找规律,然后仅花2分钟敲代码。 2.博弈是单人游戏,也...
  • tomorrowtodie
  • tomorrowtodie
  • 2016年08月10日 00:54
  • 1273

取球博弈--蓝桥杯

简述 这是2012年蓝桥杯全国软件大赛预赛(C++本科组)第10题,实质是已知球的数量,规定取球方法,判断先取球的人的输赢。 推荐链接:《2012蓝桥杯软件大赛预赛题目汇总》 题目描述     今盒子...
  • milkcu
  • milkcu
  • 2013年04月24日 23:46
  • 1874

博弈sg函数

sg函数(个人认为还是用于三种方法都无法解决的情况,如按特殊数字取石子) 我们把整个博弈过程抽象为有向无环图 1.      几项准备工作: mex求最小非负整数mex{} = 0,mex{0,1,2...
  • qq_30241305
  • qq_30241305
  • 2016年03月07日 15:36
  • 1165

博弈之Nim浅谈

博弈论应该算是一门独立的学问吧,它是现代数学不断进步的产物,是运筹学中重要的一部分。作为一个计算机科学与技术专业的学生,在这里谈论这高深的“博弈”二字实有不妥,所以,讲的不好的地方请多见谅。 Ni...
  • Yick_Liao
  • Yick_Liao
  • 2015年12月18日 15:23
  • 1078
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:博弈综合
举报原因:
原因补充:

(最多只允许输入30个字)