資料結構 基於陣列和迴圈佇列解決約瑟夫問題

2021-10-23 10:31:19 字數 1315 閱讀 7036

約瑟夫問題是乙個經典的問題,下面來介紹約瑟夫問題及其變體的解決方法。

設有編號為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...