155人阅读 评论(0)

# 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;
}

0
0

* 以上用户言论只代表其个人观点，不代表CSDN网站的观点或立场
个人资料
• 访问：12888次
• 积分：597
• 等级：
• 排名：千里之外
• 原创：48篇
• 转载：5篇
• 译文：0篇
• 评论：1条
阅读排行
最新评论