1) 問題描述
約瑟夫斯(josephus)問題的一種描述是:編號為1,2,…,n的n個人按順時針方向圍坐一圈,每人持有乙個密碼(正整數)。一開始任選乙個正整數作為報數上限值m,從第乙個人開始按順時針方向自1開始報數,報到m時停止報數。報m的人出列,將他的密碼作為新的m值,從他在順時針方向下乙個人開始重新從1報數,如此下去,直至所有的人全部出列為止。試設計乙個程式,按出列順序印出各人編號。
2)基本要求
利用單向迴圈鍊錶儲存結構模擬此過程,按照出列的順序印出各人的編號。
3)測試資料
n=7,7個人的密碼依次為:3,1,7,2,4,8,4。m初值為6(正確的出列順序應為6,1,4,7,2,3,5)。
4)提示
程式執行後,首先要求使用者指定初始報數上限m,然後讀取個人的密碼。可設n≤30。注意鍊錶中空表和非空表的界限。
5)輸入輸出:
輸入資料:建立輸入處理,輸入n輸入以及每個人的密碼;m的初值。
輸出形式:建立乙個輸出函式,輸出正確的序列。
6)選作內容
新增採用順序儲存結構實現問題求解的模組。
#include #include typedef struct node
node,*link;
void initlist(link &l)
void create(int n,link &l)
l->next = q->next;
free(q);
}void main()
printf("please input the total max number m : ");
scanf("%d",&m);
while (n<=1)
create(n,l);
printf("the final death order is : \n");
p = l;
for (int i=1;i<=n;i++)
q = p->next;
m = q->password;
printf("%d ",q->num);
p->next = q->next;
free(q);
} printf("\n*************************** the %d th josephus circu ************************\n\n",k);
k++;
printf("continue?(press '1' to proceed and '0' to exit):\n");
scanf("%d",&b);
}}
實驗結果如下圖:
第二個版本的:自認為很規範。
#include using namespace std;
/*人物的定義,包含自己的編號,所持的密碼,和指向下乙個的指標*/
struct person
;person person[7];
void circle();
void main()
m=currentperson->cipher;
cout
preperson->next=currentperson->next;//修改鍊錶,使選定的人物移出
currentperson=preperson->next;
}cout
cin>>m;
}void circle()//對人物的屬性進行編輯
person[6].next=&person[0];//使最後乙個人物的指標指向第乙個,構成迴圈鍊錶
單向環裝鍊錶操作以及約瑟夫問題求解
構建節點 class item public int getno public void setno int no public item getnext public void setnext item next override public string tostring 構建josephu鍊...
利用迴圈鍊錶求解約瑟夫問題
這題其實就是約瑟夫問題換了個 皮。用迴圈鍊錶解決的話思路最清晰,如下,注意看注釋的解釋。using system.collections.generic class circlenode 建立迴圈鍊錶節點 class solution temp.next head 迴圈結束,所有節點已經插入,則讓t...
約瑟夫環(迴圈鍊錶求解)
已知n個人 以編號1,2,3,n分別表示 圍坐在一張圓桌周圍從編號為1的人開始報數,數到m的那個人出列 他的下乙個人又從1開始報數,數到m的那個人又出列 依次規律重複下去,知道圓桌只剩下乙個人,求這個人編號。建立迴圈鍊錶,賦初始值 外迴圈次數為n,迴圈內部每次找定乙個值不為0的元素,連續訪問m次,當...