您的位置:首页 > 其它

hdu 1564 Play a game(博弈——找规律)

2017-10-18 11:00 531 查看

Play a game

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 m
4000
ove. 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

题意:有一个n*n的棋盘,棋盘的角落有一个石子,两个人轮流移动石子(8600先来),规定每次石子只能移动到当前位置的相邻位(且这个位置未被移动到过),最后谁不能移动石子则谁输,问最后谁赢

结论:当x=n*n为奇数时,后手赢,否则先手赢

证明:当x为偶数时,有y=x-1个位置可走,且y为奇数

又,若可走的步数为奇数时,先手必赢

且奇数一定可以表示为一个奇数加一个偶数的和

也就是说,以先手为主导走的路,最后一定能走到奇数步的路上,因此先手必胜

同理,若y为偶数,偶数可以表示为两个奇数的和或者两个偶数的和

只有当偶数变为奇数,也就是变为以后手为主导时,才一定可以走到奇数步的路上,因此后手必胜

详细证明博客:Boapath

代码:

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;

int main()
{
int n;
while(scanf("%d",&n),n)
{
int x=n*n;
if(x&1)
printf("ailyanlu\n");
else
printf("8600\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: