您好,登錄后才能下訂單哦!
本文小編為大家詳細(xì)介紹“C++約瑟夫環(huán)問題怎么實(shí)現(xiàn)”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“C++約瑟夫環(huán)問題怎么實(shí)現(xiàn)”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識吧。
有一家公司,這個公司有一位老板和13名程序員,每天下班前老板都會組織他們玩一次游戲,游戲的勝利者可以不加班,失敗者需要加班2小時。游戲規(guī)則如下: 一張圓桌共有13個座位,從1到13編號,游戲開始前老板會說出今天開始報數(shù)的座位編號start和淘汰序號k。 然后13名程序員開始搶位置,每個位置只能容納一程序員,每個程序員必須選擇一個座位。 座位號為start的程序員從1開始報數(shù),按如圖所示方向依次報數(shù)。每次報數(shù)為k的程序員淘汰并離開座位去加班,其他人繼續(xù)游戲,直到剩下最后一人瀟灑離去。
有一位非常聰明的程序員,每次在老板說出start和k的瞬間,就能立即選好座位并且獲勝,所以他從來沒有加過班,其他程序員都非常羨慕他,問他制勝法寶,只見他緩緩的打開了一個名為IAMGOD的.c文件,大家都露出崇拜的目光。
今天,你就是這個聰明的程序員,請完善IAMGOD.c文件內(nèi)容。
根據(jù)提示,在右側(cè)編輯器完善IAMGOD.c文件內(nèi)容,找到可以不加班的座位號。
輸入:start k
輸出:所選的座位編號i
示例1-輸入:2 3
輸出:13
#include<stdio.h> #include<malloc.h> //創(chuàng)建結(jié)構(gòu)體 typedef struct Node{ int data; struct Node* next; } NODE; //創(chuàng)建新結(jié)點(diǎn)和插入結(jié)點(diǎn) void insert(NODE* head) { int i; NODE* tail = head; //對每一個結(jié)點(diǎn)進(jìn)行編號,依次編號為1、2、3......13 for(i = 2; i <= 13; i++) { NODE* newnode; newnode = (NODE*)malloc(sizeof(NODE)); newnode->data = i; //尾插法連接鏈表 newnode->next = NULL; tail->next = newnode; tail = newnode; } /* 這段語句用來打印鏈表,檢測鏈表是否正確連接的 NODE* pmove = head; while(pmove != NULL) { printf("%d->",pmove->data); pmove = pmove->next; } */ tail->next = head; //將尾結(jié)點(diǎn)連接到頭結(jié)點(diǎn)上,形成一個環(huán) } void serch(NODE* head) { int start_data,i,k; NODE* start = head; scanf("%d%d", &start_data, &k); //移動到第start_data結(jié)點(diǎn),并將此結(jié)點(diǎn)當(dāng)成1號結(jié)點(diǎn) for(i = 2; i <= start_data; i++) { start = start -> next; } NODE* front; //front表示第k個結(jié)點(diǎn)的前一個結(jié)點(diǎn) while(start->next != NULL) { int j; for(j = 2; j <= k; j++) { front = start; //先讓front移動到當(dāng)前結(jié)點(diǎn),然后當(dāng)前結(jié)點(diǎn)往下移動,就形成一前一后的效果 start = start->next; //移動結(jié)點(diǎn) } front->next = start->next; //將第k個結(jié)點(diǎn)的上一個結(jié)點(diǎn)連接到它的下一個結(jié)點(diǎn)上 free(start);//刪除指定結(jié)點(diǎn) start = front->next;//更新start的位置,也就是1號 //當(dāng)?shù)趉個仍是本身,即只剩下了一個結(jié)點(diǎn),跳出循環(huán) if(start->data == (start->next)->data) break; } printf("%d",start->data); } int main() { //創(chuàng)建鏈表 NODE* head; head = (NODE*)malloc(sizeof(NODE)); head->data = 1; head->next = NULL; //創(chuàng)建新結(jié)點(diǎn)和連接結(jié)點(diǎn) insert(head); //查找第k個結(jié)點(diǎn)并且將其刪除。 serch(head); return 0; }
讀到這里,這篇“C++約瑟夫環(huán)問題怎么實(shí)現(xiàn)”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識點(diǎn)還需要大家自己動手實(shí)踐使用過才能領(lǐng)會,如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。