C 約瑟夫環問題詳解

2022-09-20 09:06:10 字數 1252 閱讀 7767

有一家公司,這個公司有一位老闆和13名程式設計師,每天下班前老闆都會組織他們玩一次遊戲,遊戲的勝利者可以不加班,失敗者需要加班2小時。遊戲規則如下: 一張圓桌共有13個座位,從1到13編號,遊戲開始前老闆會說出今天開始報數的座位編號start和淘汰序號k。 然後13名程式設計師開始搶位置,每個位置只能容納一程式設計師,每個程式設計師必須選擇乙個座位。 座位號為start的程式設計師從1開始報數,按如圖所示方向依次報數。每次報數為k的程式設計師淘汰並離開座位去加班,其他人繼續遊戲,直到剩下最後一人瀟灑離去。

有一位非常聰明的程式設計師,每次在老闆說出start和k的瞬間,就能立即選好座位並且獲勝,所以他從來沒有加過班,其他程式設計師都非常羨慕他,問他制勝法寶,只見他緩緩的開啟了乙個名為iamgod的.c檔案,大家都露出崇拜的目光。

今天,你就是這個聰明的程式設計師,請完善iamgod.c檔案內容。

根據提示,在右側編輯器完善iamgwww.cppcns.comod.c檔案內容,找到可以不加班的座位號。

輸入:start k

輸出:所選的座位編號i

示例1-輸入:2 3

&nwww.cppcns.combsp;        輸出:13

#include

#include

//建立結構體

typedef struct node node;

//建立新結點和插入結點

void insert(node* head)

/*這段語句用來列印鍊錶,檢測鍊錶是否正確連線的

node* pmove = head;

while(pmove != null)

*/ tail->next = head; //將尾結點連線到頭結點上,形成乙個環 }

void serch(node* head)

node* front; //front表示第k個結點的前乙個結點

while(start->next != null)

front->next = start->next; //將第k個結點的上乙個結點連線到它的下乙個結點上

free(start);//刪除指定結點

start = front->next;//更新start的位置,也就是1號

//當第k個仍是本身,即只剩下了乙個結點,跳出迴圈

if(start->data == (start->next)->data)

break;

www.cppcns.com }

printf("%d",start->data);}

int main()

約瑟夫環問題詳解

講乙個比較有意思的故事 約瑟夫是猶太軍隊的乙個將軍,在反抗羅馬的起義中,他所率領的軍隊被擊潰,只剩下殘餘的部隊40餘人,他們都是寧死不屈的人,所以不願投降做叛徒。一群人表決說要死,所以用一種策略來先後殺死所有人。於是約瑟夫建議 每次由其他兩人一起殺死乙個人,而被殺的人的先後順序是由抽籤決定的,約瑟夫...

基本約瑟夫環問題詳解

本人水平有限,題解不到為處,請多多諒解 本蒟蒻謝謝大家 推薦部落格 傳送門 首先讓我們來看一下這一段 n 2 k1 n 2 n1 n1為當前序列的總人數,因為是迴圈的序列,k1 n 1可能大於總人數 至關重要,比如 我們已經知道當前的最後乙個出列的位置為f 設下一次最後乙個出列的位置為ans 則an...

約瑟夫問題 約瑟夫環

約瑟夫 問題 有時也稱為約瑟夫斯置換,是乙個出現在電腦科學和數學中的問題。在計算機程式設計的演算法中,類似問題又稱為約瑟夫環。又稱 丟手絹問題 據說著名猶太歷史學家 josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死...