C++第15周專案3 -約瑟夫環
阿新 • • 發佈:2018-11-16
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
課程首頁地址:http://blog.csdn.net/sxhelijian/article/details/7910565,本週題目連結:http://blog.csdn.net/sxhelijian/article/details/9018813
【專案3】Josephus(約瑟夫環)問題
n個小孩子圍成一圈,從第一個小孩子開始順時針方向數數字,到第m個小孩子離開,這樣反反覆覆,最終只剩下一個小孩子,求第幾個小孩子留下?
提示:約瑟夫環即是一個首尾相連的連結串列,在建立好這個環以後,從頭結點開始,每次間隔m孩子刪除一個結點,直至只餘下一個結點(刪除了n-1個)。
參考下面的程式碼,也可以自行設計類。
//連結串列結點kid,其中number為這個人的編號struct kid{ int number; kid *next;};//約瑟夫環類 class joseph_ring{private: int n;//用於存放人數 int m;//用於存放初始密碼 kid *head;//連結串列的頭結點,初始化時指向1號孩子public: joseph_ring(int nn, int mm);//建立nn個孩子,間隔為mm的約瑟夫環 ~joseph_ring(); void show();//運算並輸出的成員函式};//定義joseph_ring類中的成員函式 ……int main(){ int n,m; cout<<"n="; cin>>n; cout<<"m="; cin>>m; joseph_ring j(n,m); j.show(); return 0;}
參考解答:
#include <iostream>using namespace std;//連結串列結點kid,其中number為這個人的編號struct kid{ int number; kid *next;};//約瑟夫環類class joseph_ring{private: int n;//用於存放人數 int m;//用於存放間隔 kid *head;//連結串列的頭結點public: joseph_ring(int nn, int mm);//建立nn個孩子,間隔為mm的約瑟夫環 ~joseph_ring(); void show();//運算並輸出的成員函式};//建立nn個孩子,間隔為mm的約瑟夫環joseph_ring::joseph_ring(int nn, int mm){ n=nn; //建構函式,把成員變數賦初值 m=mm; kid *p1,*p2; //定義2個臨時指標 for(int i=1; i<=n; i++)//for迴圈用於初始化環 { p1=new kid; p1->number=i; //編號 if(i==1) //如果當前連結串列為空,頭指標指向第一個人 { head=p1; p2=p1; } else //否則,p2永遠指向尾結點,新建立的結點都插入到p2之後 { p2->next=p1; p2=p1; } } p2->next=head;//把連結串列連成一個迴圈連結串列}joseph_ring::~joseph_ring(){ delete head; head=NULL;}void joseph_ring::show() //執行出圈操作{ kid *p1,*p2,*p; int count; p1=head; for(int i=1; i<=n-1; i++)//有n個人,所以執行n-1次迴圈,刪除n-1個人 { count=1; //用count定位到第m個人,迴圈後,p1指向這個人,p2指向這個人的上一個人 while(count<m) { p2=p1; //p2指向前一個 p1=p1->next; count++; } cout<<p1->number<<"\t";//這指向的是當前要刪除人 p=p1;//p指向當前這個人 p2->next=p1->next;//將當前出圈人的直接前驅和直接後繼連線起來 p1=p1->next;//下次從當前人的下一個人開始數 delete p;//釋放記憶體 } cout<<endl; cout<<"The last one is No. "<<p1->number<<endl; head=p1; //環中只剩下了一個結點}int main(){ int n,m; cout<<"n="; cin>>n; cout<<"m="; cin>>m; joseph_ring j(n,m); j.show(); return 0;}