關於python取石子遊戲的信息

本文目錄一覽:

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-tw/n/238568.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 12:12
下一篇 2024-12-12 12:12

相關推薦

  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29
  • Python清華鏡像下載

    Python清華鏡像是一個高質量的Python開發資源鏡像站,提供了Python及其相關的開發工具、框架和文檔的下載服務。本文將從以下幾個方面對Python清華鏡像下載進行詳細的闡…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29
  • 蝴蝶優化演算法Python版

    蝴蝶優化演算法是一種基於仿生學的優化演算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化演算法Python版…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智慧、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29

發表回復

登錄後才能評論