有三堆石頭,個數分別為 $a$ 個、$b$ 個、$c$ 個,由二人輪流取石頭,取的時候只能從其中一堆取,至少取一個,至多取全部,如此玩到最後一堆,拿完最後一個的人獲勝。請設計一程式讓電腦與 Judge 端程式對玩,由你的程式扮演先手的角色,並獲得勝利。
本題為互動題,請引入"lib1088.h"
可以使用的函式:
void Initialize(int *a,int *b,int *c)
:初始化三堆石頭,並且得到三堆石頭的個數(儲存於*a,*b,*c中),請務必在開始拿石頭之前呼叫它。void Take_Stone(int pile_no, int num, int *com_pile, int *com_num)
:從第pile_no(只能是1,2或3)堆拿取num個石頭,接著輪到電腦取石頭,電腦取石頭的動作會儲存於*com_pile 以及 *com_num 當中,分別代表第幾堆以及拿幾個。你可以假設電腦的取石頭動作都是合法的。本題沒有 Input。請不要從螢幕或檔案輸入任何東西。
※一些限制:$0\le a,b,c\le 10^ 6$
在合理的狀況之下不必擔心電腦取石頭導致超過限制時間的問題。
本題沒有 Output。
一個不保證 AC 的範例程式:
#include "lib1088.h"
int main(void)
{
int MyPile[3]={0},running=1,i,j,k;
Initialize(&MyPile[0],&MyPile[1],&MyPile[2]);
while(running)
{
for(i=0;i<3;i++)
if(MyPile[i]>0)
{
Take_Stone(i+1,MyPile[i],&j,&k);
MyPile[j-1]-=k;
}
}
return 0;
}
原TIOJ1088 / 94建中校內資訊能力競賽(prob 5 BONUS)
No. | Testdata Range | Score |
---|---|---|
1 | 0 | 16 |
2 | 1 | 16 |
3 | 2 | 16 |
4 | 3 | 16 |
5 | 4 | 16 |
6 | 5 | 20 |