C++約瑟夫環(huán)問題詳解
題目如下:
有一家公司,這個公司有一位老板和13名程序員,每天下班前老板都會組織他們玩一次游戲,游戲的勝利者可以不加班,失敗者需要加班2小時(shí)。游戲規(guī)則如下: 一張圓桌共有13個座位,從1到13編號,游戲開始前老板會說出今天開始報(bào)數(shù)的座位編號start和淘汰序號k。 然后13名程序員開始搶位置,每個位置只能容納一程序員,每個程序員必須選擇一個座位。 座位號為start的程序員從1開始報(bào)數(shù),按如圖所示方向依次報(bào)數(shù)。每次報(bào)數(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;
} 到此這篇關(guān)于C++約瑟夫環(huán)問題詳解 的文章就介紹到這了,更多相關(guān)C++約瑟夫環(huán)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Qt重寫QStackedWidget模擬實(shí)現(xiàn)home界面滑動效果
這篇文章主要為大家詳細(xì)介紹了Qt如何通過重寫QStackedWidget模擬實(shí)現(xiàn)home界面滑動效果,文中的實(shí)現(xiàn)過程講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-11-11
C++利用jsoncpp庫實(shí)現(xiàn)寫入和讀取json文件
JsonCpp 是一個C++庫,允許操作 JSON 值,包括序列化和反序列化到字符串和從字符串反序列化。本文主要介紹了如何利用jsoncpp庫實(shí)現(xiàn)寫入和讀取json文件,感興趣的可以了解一下2023-04-04

