PTA 猴子選大王 (約瑟夫環問題)

2021-10-03 02:15:59 字數 773 閱讀 7120

一群猴子要選新猴王。新猴王的選擇方法是:讓n只候選猴子圍成一圈,從某位置起順序編號為1~n號。從第1號開始報數,每輪從1報到3,凡報到3的猴子即退出圈子,接著又從緊鄰的下乙隻猴子開始同樣的報數。如此不斷迴圈,最後剩下的乙隻猴子就選為猴王。請問是原來第幾號猴子當選猴王?

輸入在一行中給乙個正整數n(≤1000)。

在一行中輸出當選猴王的編號。

這是一道類約瑟夫環問題。可以把圈子大小建立為乙個陣列,並把每只猴子初始值賦值為1,當猴子報到3退出圈子時數值變為0。這個數值改變過程每執行一次,k加1,當k == n-1時,即出局人數k,剩餘人數為1,遊戲結束。

而約瑟夫環問題,可以簡單化為陣列重複從0到n-1的執行。在迴圈中新增判斷條件,把數值為0的陣列元素跳過。當遇到數值為1的元素,執行if的語句塊,在語句塊通過count計數,當count == 3,數值變為0,k++,count重新計數,變為0。

當陣列下標移動到最大值時,陣列重新迴圈,可以理解為陣列頭尾相接,即乙個環,而count計數並不受影響,仍然可以想象為乙個圈相接報數。

#include

intmain()

}//可以簡單理解迴圈條件只是判斷遊戲是否繼續,迴圈過程是重複for迴圈執行,即陣列下標重複移動,頭尾相接。

printf

("%d"

, flag+1)

;//因為陣列從0開始。

return0;

}

解釋的會比較詳細,覺得好可以多多關注點贊

PTA 約瑟夫環(猴子選大王) 詳解

n個人圍成一圈順序編號,從1號開始按1 2 3 順序報數,報p者退出圈外,其餘的人再從1 2 3開始報數,報p的人再退出圈外,以此類推。請按退出順序輸出每個退出人的原序號。輸入格式 輸入只有一行,包括乙個整數n 1 n 3000 及乙個整數p 1 p 5000 輸出格式 按退出順序輸出每個退出人的原...

猴子選大王問題(約瑟夫環)

一群猴子排成一圈,按1,2,n依次編號。然後從第1只開始數,數到第m只,把它踢出圈,從它後面再開始數,再數到第m只,在把它踢出去 如此不停的進行下去,直到最後只剩下乙隻猴子為止,那只猴子就叫做大王。要求程式設計模擬此過程,輸入m n,輸出最後那個大王的編號。function monkey monke...

約瑟夫環(猴子選大王問題)

資料結構與演算法之約瑟夫環。與其枯燥的講解約瑟夫環,倒不如用約瑟夫環來解決乙個有趣的問題。猴子選大王問題 現在有n個猴子需要選取乙個猴王,這n個猴子手拉手圍成乙個圈,旁邊有一位德高望重的老猴,先將這一圈猴按順時針方向編號1,2.n,然後給每只小猴一張紙條,上面記錄著乙個數字m 非負數 並且由老猴王隨...