zoukankan      html  css  js  c++  java
  • BZOJ3298[USACO 2011Open]cow checkers——威佐夫博弈

    题目描述

    一天,Besssie准备和FJ挑战奶牛跳棋游戏。这个游戏上在一个M*N的棋盘上,
    这个棋盘上在(x,y)(0<=x棋盘的左下角是(0,0)坐标,棋盘的右上角是坐标(M-1,N-1)。
    Bessie每次都是第一个移动棋子,然后Bessie与Fj轮流移动。每一轮可以做以下三种中的一种操作:
    1)在同一行,将棋子从当前位置向左移动任意格;
    2)在同一列,将棋子从当前位置向下移动任意格;
    3)将棋子从当前位置向下移动k格再向左移动k格(k为正整数,且要满足移动后的棋子仍然在棋盘上)
    第一个不能在棋盘上移动的人比赛算输(因为棋子处在(0,0)点)。
    共有T个回合(1<=T<=1,000),每次给出一个新起始点的坐标(x,y),确定是谁赢。
    1<=M<=1,000,000;1<=N<=1,000,000

    输入

    第1行:两个用空格隔开的整数M和N;  
    第2行:一个整数T;  
    第3到第T+2行:两个用空格隔开的整数x和y. 

    输出

    第1到T行:包含“Farmer John”或者是“Bessie”,表示谁赢了这轮游戏。

    样例输入

    3 3
    1
    1 1

    样例输出

    Bessie
     
      题意可以转化成有两堆石子分别有x,y个,每次每个人可以在一堆取任意个或在两堆取同样多个石子,不能操作的人输。这是经典的威佐夫博弈,按先手必败的通项公式判一下即可。不了解威佐夫博弈可以参见->博弈论详解
    #include<set>
    #include<map>
    #include<queue>
    #include<cmath>
    #include<stack>
    #include<vector>
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define ll long long
    using namespace std;
    int n,m;
    int T;
    int x,y;
    int main()
    {
        scanf("%d%d",&n,&m);
        scanf("%d",&T);
        while(T--)
        {
            scanf("%d%d",&x,&y);
            if(x>y)
            {
                swap(x,y);
            }
            int ans=(y-x)*(1.0+sqrt(5.0))/2.0;
            if(ans==x)
            {
                printf("Farmer John
    ");
            }
            else
            {
                printf("Bessie
    ");
            }
        }
    }
  • 相关阅读:
    jquery验证手机号码和固定电话号码
    window下安装mongodb及php mongo扩展
    Html form 表单提交前验证
    验证电话号码中间四位加※
    php方法 隐藏手机号中间四位
    win7 64位安装redis 及Redis Desktop Manager使用
    Redis系列-远程连接redis并给redis加锁
    使用密码记录工具keepass来保存密码
    【消息队列MQ】各类MQ比较
    Syslog-ng
  • 原文地址:https://www.cnblogs.com/Khada-Jhin/p/9617553.html
Copyright © 2011-2022 走看看