約瑟夫問題是乙個經典的問題,下面來介紹約瑟夫問題及其變體的解決方法。
設有編號為1、2、3、…、n的n個人圍成乙個圈,從第乙個人開始報數,報到m的人出圈,再從他的下乙個人起從新報數,報到m的人出圈,如此下去,直到所有人全部出圈為止。給定任意的n和m,設計演算法求n個人出圈的次序。
我們嘗試使用基本的陣列來解決這一問題。
//約瑟夫問題
#include#includeusing namespace std;
const int n = 100;
void josephus(int a, int n, int m)
cout << a[num] << endl;
a[num] = 0;
k++;
} return;
}int main()
; for (int i = 0; i < n; i++)
josephus(a, n, m);
return 0;
}
使用陣列的解決方案,**相當簡潔,雖然可讀性差了一點。那麼,如果開始報數的不是1號,而是由輸入決定的p號呢?下面我們來引入約瑟夫問題的變體。
n個小孩圍坐成一圈,並按順時針編號為1、2、3、…、n,從編號為p的小孩開始報數,由1報到m,報到m的人出圈,再從他的下乙個人起從新報數,報到m的人出圈,如此下去,直到所有人全部出圈為止。請按出去的先後順序輸出小孩的編號。
我們這次嘗試使用迴圈佇列來解決問題
//用迴圈佇列解決約瑟夫問題
#include#include#includeusing namespace std;
void josephus(int n, int p, int m)
int count = 1; //記錄隊頭的報號
int data;
while (arr.size() != 0)
arr.push(data);
count++;
} return;
}int main()
printf("data in turn : ");
josephus(n, p, m);
printf("\ninput n ,p and m : ");
} return 0;
}
上面我們使用了陣列、迴圈佇列來解決約瑟夫問題。不管採用什麼樣的資料結構,解決的演算法都是一樣的。而程式是由資料結構和演算法組成的,這也是資料結構課程中最開始就強調的概念。解決約瑟夫問題還可以嘗試使用迴圈鍊錶來解決,實現思想與迴圈佇列類似,但是實現難度要高得多,這也說明了stl極大地降低了我們解決問題的難度。
資料結構 佇列和迴圈佇列
線性結構 只能從一端新增元素,從另外一端取出元素 先進先出 fifo 時間複雜度o 1 出隊時間複雜度o n public class arrayqueueimplements queue public arrayqueue override public int getsize override ...
資料結構 佇列 迴圈佇列 陣列實現
佇列是一種特殊的 線性表,特殊之處在於它只允許在表的前端 front 進行刪除操作,而在表的後端 tail 進行插入操作,和棧一樣,佇列是一種操作受限制的線性表。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。以陣列實現的佇列結構,如果是普通佇列,頻繁增刪元素,會造成陣列記憶體空間的大量流失,所...
資料結構 陣列佇列 迴圈佇列
佇列 是 先進先出 的資料結構,從隊尾入隊,從隊頭出隊。佇列中使用的array,參考 資料結構 手寫動態陣列 public inte ce queue public class arrayqueue implements queue public arrayqueue int capacity ov...