ACM-博弈之Play a game——hdu1564

Play a game

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 1291    Accepted Submission(s): 1050

Problem Description

New Year is Coming!

ailyanlu is very happy today! and he is playing a chessboard game with 8600.

The size of the chessboard is n*n. A stone is placed in a corner square. They play alternatively with 8600 having the first move. Each time, player is allowed to move the stone to an unvisited neighbor square horizontally or vertically. The one who can‘t make
a move will lose the game. If both play perfectly, who will win the game?

Input

The input is a sequence of positive integers each in a separate line.

The integers are between 1 and 10000, inclusive,(means 1 <= n <= 10000) indicating the size of the chessboard. The end of the input is indicated by a zero.

Output

Output the winner ("8600" or "ailyanlu") for each input line except the last zero.

No other characters should be inserted in the output.

Sample Input

2
0

Sample Output

8600

Author

ailyanlu

Source

Happy 2007

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1564

这道题。。。找规律博弈。

有人说打表,表示不会打,这是人家打表方法:

(摘自:http://www.cnblogs.com/lzsz1212/archive/2012/02/15/2352021.html

# include <stdio.h>
int n ;
int graph[1010][1010] ;
int dfs (int x, int y)
{
    int xx, yy, i, ans ;
    int tab[4][2] = {-1,0,1,0,0,-1,0,1} ;
    for (i = 0 ; i < 4 ; i++)
    {
        xx = x + tab[i][0] ;
        yy = y + tab[i][1] ;
        if (xx < 0 || xx >= n) continue ;
        if (yy < 0 || yy >= n) continue ;
        if (graph[xx][yy]) continue ;
        graph[xx][yy] = 1 ;
        ans = dfs (xx, yy) ;
        graph[xx][yy] = 0 ;
        if (ans == 0) return 1 ;
    }
    return 0 ;
}
int main ()
{
    graph[0][0] = 1 ;
    for (n = 1 ; n <= 8 ; n++)
        printf ("%d, %d\n", n, dfs (0,0)) ;
}

看起来就是一直搜索,回溯的时候ans是0和1交替的,这也可以解释为什么最后代码是奇偶相关。

还有别的解题方法:

(摘自 http://www.cnblogs.com/kuangbin/archive/2013/07/22/3204654.html )

作者解释:

S表示起点。

如果n为偶数,那么所有格子可以被2*1的砖块覆盖掉。

这样先手每次都移动到当前1*2的另外一块。先手必赢。

如果n为奇数。除了起始那个点,其余点都可以被覆盖。

所以后手赢。

还有一种,感觉上很不错的证明:

(摘自:http://blog.csdn.net/topc0o0der/article/details/5928391

定义记号(1,1)表示x坐标为奇,有坐标为奇,(0,1)为x坐标为偶,y坐标为奇 ,(0,0)(1,0)类推。

先说明一下结论:

n是奇数,后手胜,n是偶数,先手胜。

以n为奇数为例,说明一下制胜策略。

那么5*5棋盘为例,可以表示为:

(1,1)    (1,0)    (1,1)    (1,0)    (1,1)

(0,1)    (0,0)  
 (0,1)    (0,0)    (0,1)

(1,1)    (1,0)  
 (1,1)    (1,0)    (1,1)

(0,1)    (0,0)  
 (0,1)    (0,0)    (0,1)

(1,1)    (1,0)  
 (1,1)    (1,0)    (1,1)

先手开始(1,1),走了一步之后,必为(1,0)或(0,1);

后手只需移动到(1,1)或(0,0)即可。

一共25个格子,起初(1,1)去掉一个。还有24个,所以对称点和不对称点各有12个。先手都是不对称点,后手都是对称点。

那么刚好应该后手放最后一个。

说道这,有个地方,聪明人可能看出来。有可能没到最后,后手就没办法走了。那么我们假设一下吧。

的确有这个可能 比如2-3-8-9-10-5-4 ,先手2,8,10,4,这样的确不行。(写到这里,卡了我20来分钟,发现以前的想法是错的,还好我又想出个办法如下:)

10是先手选的,那么5是后手选的,10后手不能变,但是后手可以不选择5,改选别的。这样子,会有两个永远都取不到。不影响奇偶性,前面的推断依然可用。

这样子,我们一开始玩。出现第一个不行的话,就选另一个,而且,这样一定会舍弃偶数个格子。

严格来说,应该这样。设最后一个是先手点,那么前一个是后手点,这个后手点如果能改变则改变,如果不能改,就往前推。这样子,一改就是成对的点。要么最后取不到,要么换个方向取,不管怎么样,通过这种更改的方法,对每一种先手方案,一定能够造出后手必胜策略出来的。(能改变的后手点总是取得到的,这是因为根据图的点类型的对称性)

想想这个思想就是试验——出错——改进并且一定能改好。这样一步一步,结果能构造出。

如果n是偶数的话,对称点和不对称点个数差一,不对称多一个,是先手点的。思路同上。

以上三种解题方案,都不错,反正我是没有想到。ORZ。。

/**************************************
***************************************
*        Author:Tree                  *
*From :http://blog.csdn.net/lttree    *
* Title : Play a game                 *
*Source: hdu 1564                     *
* Hint  : 规律博弈                   *
***************************************
**************************************/
#include <iostream>
using namespace std;
int main()
{
    int n;
    while( cin>>n && n)
    if( n&1 )   cout<<"ailyanlu"<<endl;
    else    cout<<"8600"<<endl;
    return 0;
}

ACM-博弈之Play a game——hdu1564

时间: 2024-10-13 01:04:18

ACM-博弈之Play a game——hdu1564的相关文章

【转】ACM博弈知识汇总

博弈知识汇总 转自:http://www.cnblogs.com/kuangbin/archive/2011/08/28/2156426.html 有一种很有意思的游戏,就是有物体若干堆,可以是火柴棍或是围棋子等等均可.两个人轮流从堆中取物体若干,规定最后取光物体者取胜.这是我国民间很古老的一个游戏,别看这游戏极其简单,却蕴含着深刻的数学原理.下面我们来分析一下要如何才能够取胜. (一)巴什博奕(Bash Game):只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个.

ACM博弈知识汇总(转)

博弈知识汇总 有一种很有意思的游戏,就是有物体若干堆,可以是火柴棍或是围棋子等等均可.两个人轮流从堆中取物体若干,规定最后取光物体者取胜.这是我国民间很古老的一个游戏,别看这游戏极其简单,却蕴含着深刻的数学原理.下面我们来分析一下要如何才能够取胜. (一)巴什博奕(Bash Game):只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个.最后取光者得胜. 显然,如果n=m+1,那么由于一次最多只能取m个,所以,无论先取者拿走多少个,后取者都能够一次拿走剩余的物品,后者取

博弈知识入门引导

[转]ACM博弈知识汇总 https://www.cnblogs.com/kuangbin/archive/2011/08/28/2156426.html 举个栗子: 桌面上有N个小球,两个人轮流取,每人一次最多取不超过X (1<=X<n)个,取走最后一个小球的人获胜! 试问先手是否可以采取恰当的策略达到必赢的状态!可以的话输出yes,否则的话,输出no! 输入: 10 3 12 3 输出 yes no 一种简洁的搜索方式: 代码: 1 #include <iostream> 2

51nod 1185 威佐夫博奕

有2堆石子.A B两个人轮流拿,A先拿.每次可以从一堆中取任意个或从2堆中取相同数量的石子,但不可不取.拿到最后1颗石子的人获胜.假设A B都非常聪明,拿石子的过程中不会出现失误.给出2堆石子的数量,问最后谁能赢得比赛. 例如:2堆石子分别为3颗和5颗.那么不论A怎样拿,B都有对应的方法拿到最后1颗. Input 第1行:一个数T,表示后面用作输入测试的数的数量.(1 <= T <= 10000) 第2 - T + 1行:每行2个数分别是2堆石子的数量,中间用空格分隔.(1 <= N &

ACM学习历程—HDU 3915 Game(Nim博弈 &amp;&amp; xor高斯消元)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3915 题目大意是给了n个堆,然后去掉一些堆,使得先手变成必败局势. 首先这是个Nim博弈,必败局势是所有xor和为0. 那么自然变成了n个数里面取出一些数,使得xor和为0,求取法数. 首先由xor高斯消元得到一组向量基,但是这些向量基是无法表示0的. 所以要表示0,必须有若干0来表示,所以n-row就是消元结束后0的个数,那么2^(n-row)就是能组成0的种数. 对n==row特判一下. 代码:

ACM: NBUT 1107 盒子游戏 - 简单博弈

NBUT 1107  盒子游戏 Time Limit:1000MS     Memory Limit:65535KB     64bit IO Format: Practice Appoint description:  System Crawler  (Aug 13, 2016 10:35:29 PM) Description 有两个相同的盒子,其中一个装了n个球,另一个装了一个球.Alice和Bob发明了一个游戏,规则如下:Alice和Bob轮流操作,Alice先操作每次操作时,游戏者先看看

ACM三大常用博弈

尼姆博弈(Nimm Game) http://baike.baidu.com/link?url=QITS5sNMwXZsoxh5tAwYBsa-_GgUd66Vb4fjreoKkqlXmXSyPEE5qVXfxnq1IGRe4AgTxC6lFwROoKx7hZNwbK 威佐夫博弈(Wythoff Game) http://baike.baidu.com/link?url=X8KSAgEQ2b86gs6bFxYZpro--y-LrbR5aT6KPuFK5lCeoigV_YaPmaBws2X6HcL

ACM模板——简单博弈

巴什博弈:只有一堆n个物品,两个人轮流从这堆物品中取物, 规定每次至少取一个,最多取m个.最后取光者得胜. if(n%(m+1)) first win else second win 巴什博弈 变种:取光者输 if(!(n-1)%(m+1)) second win else first win 巴什博弈变种 威佐夫博弈:有两堆各若干个物品,两个人轮流从任一堆取至少一个或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜. double r = (sqrt(5.0)+1)/2

acm常见算法及例题

转自:http://blog.csdn.net/hengjie2009/article/details/7540135 acm常见算法及例题 初期:一.基本算法:     (1)枚举. (poj1753,poj2965)     (2)贪心(poj1328,poj2109,poj2586)     (3)递归和分治法.     (4)递推.     (5)构造法.(poj3295)     (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996)二.图算法