HDU4387 Stone Game

本文解析了一款名为“石子游戏”的策略游戏。游戏由两名玩家进行,在一系列格子中移动各自数量相等的石子,目标是迫使对方无法移动。文章详细分析了游戏规则,并给出了确保一方胜利的具体策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4387

                                                        Stone Game


Problem Description

  Alice and Bob are playing a game. It is played in 1*N grids. Each grid can be occupied by one stone. Alice has K white stones on the left (numbered 1 to K from left to right), and Bob has K black stones on the right (numbered 1 to K from right to left). They take turns to move their own stones, and Alice moves first. In each move, the player must choose one stone to move to the nearest empty grid forward (Alice moves to the right, Bob moves to the left). If one player cannot find any stone to move, he wins.
  Now Alice asks you to find a winning strategy of the game. Can you help him?


 

Input

   There are multiple test cases. In each case, there is one line containing two integers N, K.

Technical Specification
  3 <= N <= 1,000,000, 1 < K*2 < N
 

Output

   For each case, print in one line containing the case number (starting with 1) and the winning information. If Alice loses, just print “Bob”, otherwise print “Alice” and the first stone he chooses. If there are multiple stones he can choose, he will choose the rightmost one.
 

Sample Input
  
3 1 4 1
 

Sample Output
  
Case 1: Bob Case 2: Alice 1
 
题意:
  AB两个人玩游戏,给出n,d,n代表格子数,d代表AB各拥有的棋子数,A只能往右移动,B只能往左移动,而且AB只能移动到最靠近自己的第一个空上,A先移动,若谁先移动到不能移动为止谁就获胜,如果A赢了,输出他第一颗移动的棋子;

题解:
   移动到不能移动为止,即最终状态,A都在右边,B都在左边。分类讨论:
  1、d=1,即AB都只有一颗棋子,若n为偶数,A赢,若n为奇数,B赢;
  2、d>1,此时的原则是谁在中间n-2d的空中占的棋子数多谁就赢,因为A先走,所以不管奇数还是偶数个空,都是A赢
    只要讨论A走的第一颗棋子就行了:
                           (n-2d)=1,A移动d位子上的棋子为最优方案;
                           否则,A移动第一颗棋子为最优方案;

代码如下:
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
    int n,d,k=1;
    while(~scanf("%d%d",&n,&d))
    {
    	if(d==1 && n%2!=0) printf("Case %d: Bob\n",k++);
    	else
	    {
	                int kk=n-2*d;
			if(kk==1)printf("Case %d: Alice %d\n",k++,d);
			else printf("Case %d: Alice 1\n",k++);	
	    }
    }
    return 0;
}
























评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值