COWCHECKS

Cow cowchecks

(cowcheck.pas/c/cpp)
【 问题描述】
一天, Bessie 决定向 FarmerJohn 挑战一个游戏“奶牛西洋棋”。 游戏在一个 M*N 的棋
盘上进行, 最初棋盘上只有一个棋子, 所在方格的坐标记为(X,Y)。 左下角方格坐标为(0,0),
右上角方格坐标为(M-1,N-1)。 两个游戏者轮流走棋, Bessie 总是先走。 每步可以选择以下三
种走法之一:
1)将棋子移到它现在所在位置同行左边的任意一个格子中。
2)将棋子移到它现在所在位置同列下方的任意一个格子中。
3)将棋子移到任意一个位于它现在所在位置下方 k 行, 左边 k 列的格子中( k 为正整数,
且新位置必须在棋盘内)。
第一个不能再走棋( 也就是棋子到达了(0,0)) 的游戏者为输家)。 规定 Bessie 先走, 双
方均作出最佳决策, 找出最后的赢家是谁。( 解释: 轮到该玩家走时, 棋子已经在( 0,0) 点,
那么他是输家)
每局开始将给定一对新的 X,Y, 请你模拟 T 局游戏并求出每局的赢家。
【 输入格式】
第 1 行: 两个空格隔开的整数: M 和 N;
第 2 行: 一个整数: T;
第 3..T+2 行: 两个空格隔开的整数: X 和 Y;
【 输出格式】
第 1..T 行: 应包含”Farmer John”或”Bessie”中的一个, 即每局的赢家。
【 输入样例】
3 3
1 1
1
【 输出样例】
Bessie
【 样例说明】FJ 和 Bessie 在一个 3*3 的棋盘上下一局棋,棋子最初在(1,1( ) 也就是棋盘中央)。
【样例注释】 Bessie 最初只能将棋子移到(1,0)或(0,1)或(0,0)中的一个格子。 Bessie 可以立即
将棋子移到(0,0)从而赢下此局。
【 数据规模】
对于 20%的数据: 1≤T≤200; 1≤M≤100; 1≤N≤100;
对于 30%的数据: 1≤T≤500; 1≤M≤1,000; 1≤N≤1,000;
对于 60%的数据: 1≤T≤1,000; 1≤M≤10,000; 1≤N≤10,000;
对于 100%的数据: 1≤T≤1,000,000; 1≤M≤1,000,000; 1≤N≤1,000,000;


此题是一道非常有趣的数学题。这里写图片描述

图中的红块是Bessie的必输点,而剩下的是他的必赢点。(可以推出来)
画图可知,Bessie的必输点有(1,2);(2,1);(3,5);(4,7);(5,3)等,而(1,2)(2,1)刚好是反过来的。
从而我们可以推出一个式子:

f[i]=i+x; f[f[i]]=i; x++;

这样,这道题就很简单了。

原文地址:https://www.cnblogs.com/stevensonson/p/7612212.html