标签:约瑟夫 cur current next 链表 Soldier 数据结构 id first
编号为 1-N 的 N 个士兵围坐在一起形成一个圆圈,从编号为 1 的士兵开始依次报数(1,2,3…这样依次报),数到 m 的 士兵会被杀死出列,之后的士兵再从 1 开始报数。直到最后剩下一士兵,求这个士兵的编号。
public class JosephusProblem {
public static void main(String[] args) {
int n = 5;
int m = 2;
solution(n, m);
}
private static void solution(int n, int m) {
if(n < 1 || m < 1){
System.out.println("The number of Soldiers and report must large than 0");
return;
}
//create circle list
Soldier first = new Soldier(1);
first.next = first;
Soldier cur = first;
for (int i = 2; i <= n; i++) {
Soldier temp = new Soldier(i);
cur.next = temp;
temp.next = first;
cur = cur.next;
}
printAll(first);
Soldier previous = cur;//the previous of reporting soldier
Soldier current = first;//the reporting soldier
while (previous != current){
for (int i = 0; i < m - 1; i++) {
current = current.next;
previous = previous.next;
}
//kill the current soldier
System.out.println("Killing soldier " + current.id);
current = current.next;
previous.next = current;
}
System.out.printf("Soldier %d Survives", current.id);
}
private static void printAll(Soldier first) {
Soldier cur = first;
while (cur.next != first){
System.out.println("Soldier id is " + cur.id);
cur = cur.next;
}
System.out.println("Soldier id is " + cur.id);
}
static class Soldier{
int id;
Soldier next;
public Soldier(int id) {
this.id = id;
}
}
}
标签:约瑟夫,cur,current,next,链表,Soldier,数据结构,id,first 来源: https://blog.csdn.net/xxz753951/article/details/114406169
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。