問題描述:編號為1-n的n個士兵圍坐在一起形成乙個圈,從編號為1的士兵依次開始報數(1,2,3..依次報),數到m的士兵會被殺死出列,之後的士兵再從1開始報數。直到最後剩下一士兵。求這個士兵的編號。
方法一:陣列
第一次做這個題的時候,第一反應就是用陣列來做。建立乙個boolean陣列,用true表示沒出列,false表示出列,定義乙個計數器,遍歷陣列,當加到與m相等時,就將true變為false,計數器變為零,重新計數。
public class test
int peopleleft = n; //剩下的人數
int count = 0; //計數器,每過乙個人加一,加到m時歸零
int index = 0; //開始下標
while (peopleleft > 1)
}index++;
//當當前人等於總人數時,則又從第一人開始計數
if (index == n)
}for (int j = 0; j < n; j++)
}return null;
}public static void main(string args)
}
方法二:鍊錶
先實現乙個迴圈鍊錶,在把編號新增到鍊錶裡面,也需要乙個計數器,初始值為1,遍歷鍊錶,當計數器的值等於m是,計數器變為1,刪除當下節點。依次直到迴圈結束。
public class test2
}public static int solve(int n,int m)
node head = createlinkedlist(n);
int count = 1;
node cur = head;
node pre = null;
while(true)
if(count == m)else
}return pre.date;
}public static node createlinkedlist(int n)
//頭尾串聯
next.next = head;
return head;
}public static void main(string args)
}
方法三:遞迴
每次在讓乙個士兵出列後,對剩下的重新編號。
刪除前的編號和刪除後編號對比
m-2 n-2
m-1 n-1
m 已刪除
m+1 1
m+2 2
這樣我們就可以得到刪除前的編號與刪除後的編號的關係:刪除前編號 = (刪除後編號+m-1)%n+1,為什麼不是刪除前編號 = (刪除後編號+m)%n,因為編號是從1開始的,拖過刪除後的編號+m = n,那麼刪除前的結果就為0,不符合。
public class test3
return (f(n-1,m) + m-1) % n +1;
}public static void main(string args)
}
約瑟夫環問題的解決
約瑟夫環問題介紹 已知n個人 以編號1,2,3.n分別表示 圍坐在一張圓桌周圍。從編號為1的人開始報數,數到m的那個人出列 他的下乙個人又從1開始報數,數到m的那個人又出列 依此規律重複下去,直到圓桌周圍的人全部出列。include include include typedef int datat...
python解決約瑟夫環問題
問題描述 編號為 1 n 的 n 個士兵圍坐在一起形成乙個圓圈,從編號為 1 的士兵開始依次報數 1,2,3 這樣依次報 數到 m 的 士兵會被殺死出列,之後的士兵再從 1 開始報數。直到最後剩下一士兵,求這個士兵的編號。有用遞迴函式 f n,m 的返回結果是存活士兵的編號,推導出old 與 new...
c 解決約瑟夫環問題
c 解決約瑟夫環問題 約瑟夫 josephus 問題 m個人圍坐成一圈,從1開始順序編號 遊戲開始,從第乙個人開始由1到n迴圈報數 報到m的人退出圈外問 最後留下的那個人原來的序號 本題可以定義乙個容器 vector 初始化大小 元素個數 為n。容器裡元素的值標識該人是否出局,1在圈內,0出局。值為...