hdu 4387 Stone Game

来源:互联网 发布:sql sever check 约束 编辑:程序博客网 时间:2024/06/04 19:06


长度为N的格子,Alice和Bob各占了最左边以及最右边K个格子,每回合每人可以选择一个棋子往对面最近的一个空格移动。最先不能移动的人获得胜利。

  官方题解:

  k=1时

  很容易看出,n为奇数则后手获胜,n为偶数则先手获胜

  k>1时

  如果n=2*k+1,则棋 盘中只有一个空白的格子,每次移动必须移动到当前的空白格子上。先手方可以先随意选择一颗棋子占据中间的位置,然后双方互有移动,移动过程中双方肯定都会 选择一颗在己方半场的棋子移动到对方半场里。直到后手方还剩下一颗己方半场的棋子时,先手方把占据中间的棋子移动到对方半场,此时后手方必须移动剩下的这 颗棋子到空出的中间的格子里,先手方再把最后一颗棋子移动到新空出的位置即可获胜。

  如果n>2*k+1,那么棋盘中就有了多余一个的 空白格子。如果n为奇数,先手方只要每次移动己方最靠后的一颗棋子即可获胜。并且第一次移动必须选择1号棋子,否则会让自己的棋子中间留下空白相当于把先 手让给了对方,这时对方只要采用先手策略即可获胜;如果n为偶数,那么先手方只需采用n=2*k+1时的策略在双方交会的时候保住先手即可,当然此时的第 一步还是1号棋子,否则将失去先手优势。


#include<iostream>#include<cstdio>#include<math.h>using namespace std;int main(){    int t=0,i,j,n,k;    while(~scanf("%d%d",&n,&k))    {        printf("Case %d: ",++t);        if(k==1 && n%2)   puts("Bob");        else if(n==2*k+1) printf("Alice %d\n",k);        else  puts("Alice 1");    }    return 0;}


原创粉丝点击