1、用循环队列求解约瑟夫问题:设有n个人站成一圈,其编号为从1到n。从编号为1的人开始按顺时针方向1、2、3...循环报数,数到m的人出列,然后从出列者的下一个人重新开始报数,数到m的人又出列,如此重复进行,直到n个人都出列为止。要求输出这n个人的出列顺序,并用相关数据进行测试。 具体设计如下: (1)采用Queue<Integer>作为循环队列qu,先将1-n进队。循环n次共出列n个人,每次从队头开始数m-1个人(出队m-1个人并将它们进队到队尾),再出列第m个人。对应的程序设计如下: Class Joseph{ ......... } (2)设计测试类 Public class Exp2{ ....... }
时间: 2023-06-19 10:03:32 浏览: 181
约瑟夫问题 设有N名同学手拉手围成一圈,自1、2、3、......开始编号,现从1号开始连续数数,
下面是使用循环队列求解约瑟夫问题的Java代码:
```java
import java.util.LinkedList;
import java.util.Queue;
public class Joseph {
public static void joseph(int n, int m) {
Queue<Integer> qu = new LinkedList<>();
for (int i = 1; i <= n; i++) {
qu.offer(i);
}
int count = 0;
System.out.print("出列顺序:");
while (!qu.isEmpty()) {
int x = qu.poll();
count++;
if (count == m) {
count = 0;
System.out.print(x + " ");
} else {
qu.offer(x);
}
}
}
}
```
测试类如下:
```java
public class Exp2 {
public static void main(String[] args) {
Joseph.joseph(10, 3);
}
}
```
输出结果为:
```
出列顺序:3 6 9 2 7 1 8 5 10 4
```
阅读全文