黑马程序员技术交流社区
标题:
第一帖,约瑟夫问题,帮忙优化优化
[打印本页]
作者:
曾权
时间:
2013-11-23 01:04
标题:
第一帖,约瑟夫问题,帮忙优化优化
<font color="Green">/*
* 有n个孩子站成一圈,从第一个孩子开始顺时针方向报数,
* 报到3的人出列,下一个人继续从1报数,直到最后剩下
* 一个孩子为止。问剩下第几个孩子。下面的程序以10个
* 孩子为例,模拟了这个过程,请完善之(提示:报数的
* 过程被与之逻辑等价的更容易操作的过程所代替)。
*
* 方法一(蓝桥杯给出的方法):
* 数到不是出列的孩子删除并把这个孩子加到队列的最后,
* 数到出列的孩子直接删除,直到只剩下最后一个孩子为止
* Vector a = new Vector();
for(int i=1; i<=10; i++)
{
a.add("第" + i + "个孩子");
}
for(;;)
{
if(a.size()==1) break;
for(int k=0; k<2; k++)
a.add(a.remove(0));
a.remove(0);
}
System.out.println(a);
*
* */</font>
<font color="Green">//方法二:利用引用来模拟出循环链表来决解
//这一个方法可以灵活变通,可以从随机一个孩子开始数</font>
class Peoson{<font color="Green">//定义一个孩子类</font>
int num; <font color="Green">//孩子编号</font>
static int count=0; <font color="Green">//正在游戏中的孩子总数</font>
Peoson getNext=null;<font color="Green">//本类的引用,用来指向下一个孩子.</font>
Peoson(int num){
count++; <font color="Green">//每创建一个孩子加1</font>
this.num=num;
}
}
public class BaoshuGame {
public static void main(String[] args) {
Peoson p=new Peoson(1);<font color="Green"> //创建第一个孩子//</font>
Peoson p1=p; <font color="Green">//p1表示指针,开始p1为第一个孩子</font>
for (int i = 2; i <= 10; i++) {
<font color="Green">//从第二个孩子开始创建,并且前一个孩子指向下一个孩子</font>
Peoson p2=new Peoson(i);<font color="Green">//创建孩子对象</font>
p1.getNext=p2; <font color="Green">//p1指向这个孩子</font>
p1=p2; <font color="Green">//p1变为这个孩子(和p1指向这个孩子是不同的概念,这里实现了p1的移动)</font>
}
p1.getNext=p; <font color="Green">//到这为止,p1为最后一个孩子,并指向第一个孩子,循环链表已经形成</font>
<font color="Green">//下面开始报数
/*
* 实现过程是:报到的孩子出列,即这个孩子的前一个孩子指向这个孩子的下一个孩子,让
* 这个孩子成为野孩子
* */</font>
while(Peoson.count!=1){
Peoson p2=null;
for (int i = 1; i < 3; i++) {
p2=p;
p=p.getNext;
}
<font color="Green">//循环两次后p为第三个孩子了,即要出列的孩子,p2为出列孩子的前一个孩子</font>
p2.getNext=p.getNext;<font color="Green">//出列孩子的前一个孩子指向出列孩子的下一个孩子</font>
p=p.getNext;<font color="Green">//从出列孩子的下一个孩子开始</font>
Peoson.count--;<font color="Green">//孩子个数减1</font>
}
System.out.println(p.num);<font color="Green">//打印最后一个孩子的编号,游戏结束</font>
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2