Java_案例实例2.约瑟夫环问题
生活随笔
收集整理的這篇文章主要介紹了
Java_案例实例2.约瑟夫环问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
約瑟夫環問題描述:
編號為1-N的N個人按順時針方向圍坐成一圈,從第S個人開始報數(從1報起),報數為M的人出圈,再從他的順時針方向的下一個人重新開始報數,如此下去,直至所有人出圈為止,給出N個人的出去順序
算法:
1、設置一個boolean數組out,元素out[i]標記編號為i的人是否已經出圈
2、從編號為S 的人開始,若為報數至M,則繼續尋找下一出圈標記為false的 人
3、輸出報數為M的人的編號,并修改其對應的出圈標記為true
4、若輸出人數未達到M,則繼續尋找下一出圈標記為false的人并重新報數,否則結束
源代碼:
package ch4_2;public class JosephRing {public static void main(String[] args) {// 總人數final int N = 13;// 從第S個人開始報數final int S = 3;// 報數為M的人出圈final int M = 5;// 統一下標與人的標號(自然計數)boolean[] out = new boolean[N + 1];// 初始化數組for (int i = 1; i <= N; i++) {// 報數前所有人都未出圈out[i] = false;}// 存放下次開始報數的人的編號int i = S;// 已出圈的人int n = 0;// 報數為count的人int count;System.out.println("出圈順序:");// 仍有人在圈內while (n < N) {// 出圈后重新計數count = 0;// 未報數至Mwhile (count < M) {// 報數的人未出圈if (out[i] == false) {// 報數count++;}// 未報數至M(上面的if語句可能修改了count)if (count < M) {// 求下一個的編號(到達N+1則回到第1個人)i = (i + 1 > N ? 1 : i + 1);}}// 內層while結束,編號為i的人出圈System.out.println(i + " ");// 標記出圈的人out[i] = true;// 又有一人出圈n++;}}}總結
以上是生活随笔為你收集整理的Java_案例实例2.约瑟夫环问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java_案例实例1.简单的人机交互
- 下一篇: Java实例_综合实践3.K-Means