本文目錄一覽:
- 1、C++編程, 取石子遊戲. 一堆石21個石子. 玩家1跟玩家2輪流取1-4的石子. 取走最後一個石子的玩家勝出.
- 2、北理工C語言【遊戲】取石子
- 3、C語言撿石子遊戲
- 4、杭電acm 第2516題 取石子 遊戲 的答案
- 5、取石子遊戲求答案!!
- 6、取石子遊戲怎麼定勝?
C++編程, 取石子遊戲. 一堆石21個石子. 玩家1跟玩家2輪流取1-4的石子. 取走最後一個石子的玩家勝出.
第一個取石子的人一定會取勝,請參考以下策略:
第一個人取1顆石子;
第二個人取x(1=x=4)顆石子;
第一個人取(5-x)顆石子,即始終保證他所取的石子數與第二個人剛才取的石子數,相加為5;
重複步驟2,3直至石子取完,第一個人始終將獲得最後一顆石子。
北理工C語言【遊戲】取石子
#includestdio.h
#includeconio.h
int main(void)//也就是a或者b有一項為2或者1時,有必勝方法.
{
int i, T, a[50] = { 0 }, b[50] = { 0 }, c[50] = { 0 };
scanf(“%d”, T);
for (i = 0; i T; ++i)
{
scanf(“%d”, a[i]);
scanf(“%d”, b[i]);
if (a[i] == 1 || a[i] == 2 || b[i] == 1 || b[i] == 2)
c[i] = 1;
}
for (i = 0; i T; ++i)
{
if (c[i] == 1)
printf(“YES\n”);
else
printf(“NO\n”);
}
getch();
return 0;
}
C語言撿石子遊戲
可以用遞歸來做,
假設 有A,B兩堆石子。 A的數量是x,B的是y
遞歸的出口是3個狀態。
1:其一等於1,另一個等於2 (輸)
2:其一等於1,另一個2 (贏)
3:其一等於2,另一個1 (贏)
另外,只需要定義操作了, 操作只能是兩者之一。 其一:(de_both)兩堆都減去同一數字的石子。另外一個(de_one)就是人選一堆,拿掉任意個數的石子。
遞歸過程如下;
void simulate(int a,int b)
{
switch(state)
{
case 1:
you lose;
case 2:
break;
case 3:
you win;
}
if(abs(a,b)=1) /*這時候一定能贏*/
{
de_both(min(a,b)-1); /*兩邊都取走兩者中最小數-1個石子,形成狀態1的形式*/
}
else
{
de_one(random); /*這裡的random只需要不使兩者之差=1即可*/
}
simulate(a,b);
}
杭電acm 第2516題 取石子 遊戲 的答案
#includeiostream
#includefstream
#includealgorithm
using namespace std;
int Fib[44];
int main()
{
int n;
Fib[0]=2;Fib[1]=3;
for(int i=2;i44;i++)
Fib[i]=Fib[i-1]+Fib[i-2];
while(cinnn){
if(std::binary_search(Fib,Fib+44,n))
cout”Second win”endl;
else
cout”First win”endl;
}
return 0;
}
/*
博弈論
解題分析:
當n為1的時候是輸出first,n為2的時候輸出second,
3的時候也是輸出second,當n為4的時候,第一個人想獲勝就必須先取
一個,這是剩餘的石子數為3,此時無論第二個人如何取,第一個人都
能夠贏,當n為5的時候,first不可能獲勝,因為他取2時,second直接
取掉剩餘的3個,取1時,second也是取1,這樣就演變為n為3的時候了,
所以n為5時候,輸出的是second ,當n為6的時候,first只要取掉1個,
就可以讓局勢變為n為5的時候,輸出的是first,n為7的時候,first取掉
2個,又可以變為5的時候,所以也是輸出first,n為8的時候,當first
取1個時候,局勢變為7的時候,第二個人可以贏,取2時候,變為n為6的時
候,也是第二個人贏,取三個時候,second直接取掉剩餘的5個,所以,n為
8的時候,是輸出second。從上面可以看出,n為2,3,5,8時,這些都是輸
出second,也就是說這些就是必敗點,仔細的人會發現這些滿足斐波那契數
的規律,可以推斷13也是一個必敗點,也就是說,只要是斐波那契數,都是
必敗點,輸出的就是second,所以,我們可以利用斐波那契數數的公式:
fib[i]=fib[i-1]+fib[i-2],只要n是斐波那契數,那就輸出second,所以有
if(n==fib[i])
printf(“Second win\n”);
else
printf(“First win\n”);
*/
取石子遊戲求答案!!
樓主你好:
我不是高手,以下是我在互聯網上給你找的,對你絕對有幫助,算是公式吧,
建議你在參考資料里查看原文。
有三堆各若干個物品,兩個人輪流從某一堆取任意多的物品,規定每次至少取一個,多者不限,最後取光者得勝。
這種情況最有意思,它與二進制有密切關係,我們用(a,b,c)表示某種局勢,首先(0,0,0)顯然是奇異局勢,無論誰面對奇異局勢,都必然失敗。第二種奇異局勢是(0,n,n),只要與對手拿走一樣多的物品,最後都將導致(0,0,0)。仔細分析一下,(1,2,3)也是奇異局勢,無論對手如何拿,接下來都可以變為(0,n,n)的情形。
計算機算法裡面有一種叫做按位模2加,也叫做異或的運算,我們用符號(+)表示這種運算。這種運算和一般加法不同的一點是1+1=0。先看(1,2,3)的按位模2加的結果:
1 =二進制01
2 =二進制10
3 =二進制11 (+)
———————
0 =二進制00 (注意不進位)
對於奇異局勢(0,n,n)也一樣,結果也是0。
任何奇異局勢(a,b,c)都有a(+)b(+)c =0。
如果我們面對的是一個非奇異局勢(a,b,c),要如何變為奇異局勢呢?假設 a b c,我們只要將 c 變為 a(+)b,即可,因為有如下的運算結果: a(+)b(+)(a(+)b)=(a(+)a)(+)(b(+)b)=0(+)0=0。要將c 變為a(+)b,只要從 c中減去 c-(a(+)b)即可。
例1:(14,21,39),14(+)21=27,39-27=12,所以從39中拿走12個物體即可達到奇異局勢(14,21,27)。
例2:(55,81,121),55(+)81=102,121-102=19,所以從121中拿走19個物品就形成了奇異局勢(55,81,102)。
例3:(29,45,58),29(+)45=48,58-48=10,從58中拿走10個,變為(29,45,48)。
例4:我們來實際進行一盤比賽看看:
甲:(7,8,9)-(1,8,9)奇異局勢
乙:(1,8,9)-(1,8,4)
甲:(1,8,4)-(1,5,4)奇異局勢
乙:(1,5,4)-(1,4,4)
甲:(1,4,4)-(0,4,4)奇異局勢
乙:(0,4,4)-(0,4,2)
甲:(0.4,2)-(0,2,2)奇異局勢
乙:(0,2,2)-(0,2,1)
甲:(0,2,1)-(0,1,1)奇異局勢
乙:(0,1,1)-(0,1,0)
甲:(0,1,0)-(0,0,0)奇異局勢
甲勝。
對於本次普及組“取石子遊戲”來說,
19 010011
7 000111
5 000101
3 000011
010010 (18)10
50-18=32
所以第1次只能在第5堆石子中取32粒,使得取出32粒後為奇異局勢,即異或運算結果為0。
取石子遊戲怎麼定勝?
只有一堆時,無論有多少,先取者都可以一次性全部取走,所以必勝。
(1,1)時,顯然先取者必敗。
(1,2)時,先取者必勝,他可以在2那一堆中取1個,於是變成(1,1),但這成為上一種情況了,於是接下來取的人必敗,亦即先取者必勝。
(1,3)時,先取者必勝。他可以在3那一堆中取2個,於是變成(1,1)。
(2,2)時,先取者必敗。他在任何一堆中取1個,對方隨即在另一堆中取1個,即變成(1,1);如果他取走一堆中的全部石子,對方即取走另一堆中的全部石子。
(2,3)時,先取者必勝。他可以在3那一堆中取1個,於是變成(2,2)。
(3,3)時,先取者必敗。他取走任一堆中的1,2或3個,就變成了以上討論過的情形。
(1,1,1)時,先取者必勝。他取走任一堆,就變成了(1,1)。
(1,1,2)時,先取者必勝。他取走2那一堆,就變成了(1,1)。
(1,1,3)時,先取者必勝。他取走3那一堆,就變成了(1,1)。
(1,2,2)時,先取者必勝。他取走1那一堆,就變成了(2,2)。
(1,2,3)時,先取者必敗。分析如下:
他先取1那一堆,則變為(2,3),由上面的分析,對手必勝。
他從2那一堆中取1個,就變成了(1,1,3),對手可以將3那一堆全部取走,變成了(1,1),於是必勝。
他將2那一堆全部取走,就變成了(1,3),對手必勝。
他從3那一堆中取1個,就變成了(1,2,2),對手必勝。
他從3那一堆中取2個,就變成了(1,2,1),對手必勝。
他將3那一堆全部取走,就變成了(1,2),對手必勝。
這些勝負有什麼規律呢?我們可以將每堆的數轉換成二進制,然後看每一位上所有堆里的1的個數總和:
必勝情況:(n) (1,2)(1,3)(2,3) (1,1,1)(1,1,2)(1,2,2)
必敗情況: (1,1)(2,2)(3,3) (1,2,3)
化為二進制:
必勝情況:
(n)只有1堆:……(反正每位只要有1肯定只有1個)
(1,2):1,10
列成豎式:
01
10
個位上只有1個1,“十位”(因為是二進制所以叫十位不妥,這裡為了方便說明暫且使用,下同)上也只有1個1。
(1,3):1,11
列成豎式:
01
11
個位上有2個1(1的1個,3的1個),十位上有1個1。
(2,3):10,11
個位上有1個1,十位上有2個1。
(1,1,1):1,1,1
個位上有3個1。
(1,1,2):1,1,10
個位上有2個1,十位上有1個1。
(1,1,3):1,1,11
個位上有3個1,十位上有1個1。
(1,2,2):1,10,10
個位上有1個1,十位上有2個1。
必敗情況:
(1,1):1,1
個位上有2個1。
(2,2):10,10
十位上有2個1。
(3,3):11,11
個位上有2個1,十位上也有2個1。
(1,2,3):1,10,11
個位上有2個1,十位上也有2個1。
下面分析一下這些情況。
先看必敗情形。容易發現,所有的必敗情形,都是所有的數位上都有偶數個1。
下看必勝情形。我們發現,出現了兩種情況:
1.只有1位上有奇數個1,如(1,3)(2,3)(1,1,1)(1,1,2)(1,2,2)。而先取者取走該位上的1,所有的位上就都變成了偶數個1,而這時後取者變成了先取者。
2.有若干位上都是奇數個1,如(n)(1,2)(1,1,3)。先取者取(不一定取走哪位)後,所有的位上也都變成了偶數個1。後取者變成了先取者。
以上兩種情況,都是將後取者逼至必敗情況從而取勝。
由以上分析我們可以得到結論:將所有的堆的石子數化為二進制後,如果所有數位上的1的個數都是偶數,那麼先取者必敗;如果有些位上的1的個數是奇數,先取者能夠將所有數位上的1的個數都變為偶數的話,那麼先取者必勝。
好,下面來分析我們的題目。
3,5,7,19,50化為二進制是:
000011
000101
000111
010011
110010
可見,只有最高位的1是奇數個,其他位上都是偶數個。
所以只需要將最高位的1取走即可必勝。
二進制的100000就是10進制的32,所以要將50個石子的那堆取32個,取掉就變成偶數個數目。於是先取者必勝。以後無論對方怎麼取,始終保證每一位上的1的個數是偶數即可(一種簡單的方法是,他在一堆中取幾個,你在另一堆中也取幾個就可以)。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/238568.html