HDU 4387 Stone Game [博弈]

  长度为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号棋子,否则将失去先手优势。

 

 1 #include <string.h>
 2 #include <stdio.h>
 3 int n, k, cas = 1;
 4 int main(){
 5     while(scanf("%d%d", &n, &k) != EOF) {
 6         printf("Case %d: ",cas++);
 7         if (k == 1) printf(n%2?"Bob\n":"Alice 1\n");
 8         else if(n == 2*k+1) printf("Alice %d\n", k);
 9         else printf("Alice 1\n");
10     }
11     return 0;
12 }
posted @ 2012-10-04 15:48  Burn_E  阅读(264)  评论(0编辑  收藏  举报