C語言解決約瑟夫環問題 詳細註釋
約瑟夫環演算法是: n 個人圍成一圈,每個人都有一個互不相同的密碼,該密碼是一個整數值,選擇一個人作為起點,然後順時針從 1 到 k(k為起點人手中的密碼值)數數。數到 k 的人退出圈子,然後從下一個人開始繼續從 1 到 j (j為剛退出圈子的人的密碼)數數,數到 j 的人退出圈子。重複上面的過程,直到剩下最後一個人。
/*約瑟夫環*/ #include <stdio.h> #include <stdlib.h> #define N 9 //環中人的個數 #define OVERFLOW 0 int KeyW[N]={4,7,5,9,3,2,6,1,8}; //每個人手中的密碼 typedef struct LNode{ //定義迴圈連結串列 int keyword; struct LNode * next; }LNode,*LinkList; void Joseph(LinkList p,int m,int x){ //x為總人數,m為刪除的那個人手中的密碼,起始的m為第一個人手中的密碼 LinkList q; int i; if(x==0)return; q=p; m%=x; if(m==0)m=x; for(i=1;i<=m;++i){ //找到第m個人 p指向要刪除的人的前一人 q指向要刪除的人 p=q; q=p->next; } p->next=q->next; //刪除q i=q->keyword; //得到下一個要刪除的人的位置 printf("%d ",q->keyword); free(q); Joseph(p,i,x-1); //遞迴呼叫 總人數減1,輸入新的密碼 } int main() { int i,m; LinkList Lhead,p,q; //Lhead指向頭,p指向尾指標,q指向新建指標 Lhead=(LinkList)malloc(sizeof(LNode)); if(!Lhead)return OVERFLOW; Lhead->keyword=KeyW[0]; Lhead->next=NULL; p=Lhead; for(i=1;i<9;++i){ if(!(q=(LinkList)malloc(sizeof(LNode)))) return OVERFLOW; q->keyword=KeyW[i]; //對q的keyword進行賦值 p->next=q; //將q賦給p的next p=q; //p要指向尾部,將q賦給p } p->next=Lhead; //構造迴圈連結串列 printf("請輸入第一次計數值m :\n"); scanf("%d",&m); printf("輸出的佇列是:\n"); Joseph(p,m,N); return 0; }
------沒有別人聰明,就請付出更多的努力------
相關推薦
C語言解決約瑟夫環問題 詳細註釋
約瑟夫環演算法是: n 個人圍成一圈,每個人都有一個互不相同的密碼,該密碼是一個整數值,選擇一個人作為起點,然後順時針從 1 到 k(k為起點人手中的密碼值)數數。數到 k 的人退出圈子,然後從下一個人開始繼續從 1 到 j (j為剛退出圈子的人的密碼)數數,數到 j 的人退
(演算法)C語言模擬約瑟夫環問題
約瑟夫環問題描述 m個人圍坐一圈,每人持有一個數字,從第一個人開始從1報數,報到n(第一輪n任意給定)的人出圈,將n改為這個出圈的人所持有的數字,下個人開始從1報數,繼續報到n的人出列;依次類推直到所有
C語言解決約瑟夫問題演算法
據說著名猶太曆史學家 Josephus有過以下的故事:在羅馬人佔領喬塔帕特後,39 個猶太人與Josephus及他的朋友躲到一個洞中,39個猶太人決定寧願死也不要被敵人抓到,於是決定了一個自殺方式,4
c語言實現約瑟夫環-每隔幾個刪除一個,求剩下的
c語言連結串列實現約瑟夫環的程式碼,每隔任意元素刪除一個,逐步輸出各個刪除元素 #include<stdio.h> #include<malloc.h> #include<string.h> #define N 10 struct lno
用循環鏈表解決約瑟夫環問題
循環 解決 使用 end head als list output 循環條件 約瑟夫環是一個數學的應用問題:已知n個人(以編號1,2,3...n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下一個人又從1開始報數,數到m的那個人又出列;依此規
單循環鏈表 解決約瑟夫環的問題
malloc 表示 重復 printf 約瑟夫 ext std head eof 已知n個人(以編號1,2,3...n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下一個人又從1開始報數,數到m的那個人又出列;依此規律重復下去,直到圓桌周圍的
【c++提問】約瑟夫環問題
ocl wmi lsa rul 2dx hdp and kml eee 家煩堵zx1ul秩枷言http://weibo.com/u/6221316968部坎夢8t970帕糖良http://weibo.com/u/6378557985兜杉稚k9v00劑重凸http://wei
用迴圈連結串列解決約瑟夫環的問題
約瑟夫環問題簡介 約瑟夫環問題的原來描述為,設有編號為1,2,……,n的n(n>0)個人圍成一個圈,從第1個人開始報數,報到m時停止報數,報m的人出圈,再從他的下一個人起重新報數,報到m時停止報數,報m的出圈,……,如此下去,直到所有人全部出圈為止。當任意給定n和m後,設計演算法求n個人出
PHP解決約瑟夫環的問題
//準備好41個人 $people = array(); for($i=0;$i<=40;$i++) { $people[] = $i+1; } /** * @param $people 準備好的陣列 * @param $step 每到第幾個人,會把他殺掉 * @p
php解決約瑟夫環
轉載 https://www.cnblogs.com/china90/p/7367396.html 今天偶遇一道演算法題 “約瑟夫環”是一個數學的應用問題:一群猴子排成一圈,按1,2,…,n依次編號。然後從第1只開始數,數到第m只,把它踢出圈,從它後面再開始數, 再數到第m只,在把它
C語言(約瑟夫問題)
約瑟夫問題 問題一: #include <stdio.h> #include <stdlib.h> typedef struct node { int data; struct node *next; } ListNode; typedef ListNod
php通過迴圈鏈解決約瑟夫環
本想著用php寫些資料結構提升一下,寫到鏈的時候看到約瑟夫環問題,嘗試用迴圈鏈寫了一下 約瑟夫環: 約瑟夫環(約瑟夫問題)是一個數學的應用問題:已知n個人(以編號1,2,3...n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下一個人又
連結串列解決約瑟夫環問題
第一次做約瑟夫環問題,歡迎大家來找茬~ 如果做單迴圈連結串列時有點暈了,要畫圖要畫圖要畫圖,重要的事講三遍,因為真的是很好的方法。 #include<stdio.h> #include<stdlib.h> typedef struc
C++vector實現約瑟夫環
//向量求解約瑟夫環 #include <iostream> #include <vector> #include <iomanip> using namespace std; int main() {int n, m;cin >&
使用連結串列解決約瑟夫環的問題
已知n個人(以編號1,2,3…n分別表示)圍坐在一張圓桌周圍。從編號為1的人開始報數,數到m的那個人出列;他的下一個人又從1開始報數,數到m的那個人又出列;依此規律重複下去,直到圓桌周圍的人全部出列,問最後一個出環的人的原編號。 用在單鏈表中刪除一個結點的思想
使用連結串列解決約瑟夫環問題
1139 約瑟夫環問題 時間限制:500MS 記憶體限制:65536K 提交次數:157 通過次數:79 題型: 程式設計題 語言: G++;GCC Description 約瑟夫(josephus)環是這樣的:假設有n個小孩圍坐成一個圓圈,並從1開始依次
URAL 1521 War Games 2 樹狀陣列解決約瑟夫環,輸出離隊順序
In accordance with this scheme, the war games are divided into N phases; and N soldiers, successively numbered from 1 to N, are marching round a circle on
C語言處理約瑟夫問題(丟手絹)
(部分經驗援引自其他人)問題描述: 在羅馬人佔領喬塔帕特後,39 個猶太人與Josephus及他的朋友躲到一個洞中,39個猶太人決定寧願死也不要被敵人抓到,於是決定了一個自殺方式,41個人排成一個圓圈,由第1個人開始報數,每報數到第3人該人就必須自殺,然後再由下一個重
靜態連結串列解決約瑟夫環問題
#include<stdio.h> #define MAXSIZE 100 struct { int cur ; int number; int secret_node; }space[MAXSIZE]; int main(void) { int
利用陣列解決約瑟夫環問題
約瑟夫環問題描述:編號為1,2… n的n個人按順時針方向圍坐一圈,每人持有一個密碼(正整數)。一開始任選一個正整數作為報數的上限值m,從第一個人開始按順時針方向自1開始順序報數, 報到m時停止報數,報m的人出列,將他的密碼作為新的m值,從他的順時針方向上的下一個開始重新從1報數,如此下去,直至所有人全部出列為