用java解决约瑟夫问题
来源:互联网 发布:linux怎么删除组 编辑:程序博客网 时间:2024/05/22 13:25
- 用数组实现链表来解决约瑟夫问题:
class ArrayList{
public static void main(String[] args) {
//判断用户是否给出参数
//如果没有给出2个,则提示然后退出,否则继续
if(args.length!=2){
System.out.println("You must give two argument!");
System.exit(0);
}
//System.out.println(("123").matches("[0-9]*"));
//判断给的两个参数是否都是可以转换为数字
//如果两个参数中有一个不是,则提示,然后退出,否则继续
for(int i=0; i<args.length; i++){
if( !args[i].matches("[0-9]*")) {
System.out.println("Two argument must be Number!");
System.exit(0);
}
}
//利用给出的参数进行数组的初始化
int[] a=new int[Integer.parseInt(args[0])];
for (int i=0; i<a.length-1; i++){
a[i]=i+1;
}
a[a.length-1]=0;
int index=0; //用来存储当前位置
int countNum=0; //用来计数
//测试数组是否赋值成功
/*for(int i=0; i<a.length; i++){
System.out.println(a[index]);
index=a[index];
}*/
//当某索引中的值与索引相同时,说明只剩下一个了
while(a[index] !=index ){
countNum ++;
//判断是否应该有人退出
//要改数到的那个同学的上一位,所以需要-1
//删除,就是把前一个索引处的值改成当前索引所对应的值
if (countNum==Integer.parseInt(args[1])-1){
a[index]=a[a[index]];
countNum=0;
}
index=a[index]; //设置下一个索引为当前索引对一个的值
}
System.out.println(index);
}
}
2、用数组实现:生成一个指定长度的数组,将所有的元素赋值为true,从头开始数,遇到countNum为3的将值改变为false;循环执行,直至只剩下一个true的值
public class Count3Quit
{
public static void main(String [] args){
boolean[] arr = new boolean[500];
for(int i = 0;i<arr.length;i++){
arr[i] = true;
}
int leftCount = arr.length;
int countNum = 0;
int index = 0;
while(leftCount > 1){
if(arr[index] == true){
countNum ++;
if(countNum == 3){
arr[index] = false;
countNum = 0;
leftCount --;
}
}
index ++;
if(index == arr.length){
index = 0;
}
}
for(int i = 0;i<arr.length;i++){
if(arr[i]==true){
System.out.println(i);
}
}
}
}
3、用面向对象的方式解决约瑟夫问题
有一个孩子的对象,有一个圆圈的对象。每一个孩子都有左孩子和右孩子以及自己的编号属性。圆圈对象,有开始孩子,结束孩子,以及孩子的总数;还有增加孩子和删除孩子的方法。首先增加500个孩子,然后从开始孩子开始数数,从1开始,每到3删除该孩子。直至只剩一个孩子,就是结果。
public class Count3Quit3
{
public static void main(String [] args){
KidCircle kc = new KidCircle(500);
System.out.println(kc.last.id);
int countNum =0;
Kid k = kc.first;
while(kc.count>1){
countNum++;
if(countNum == 3){
kc.delete(k);
countNum = 0;
}
k = k.right;
}
System.out.println(kc.first.id);
}
}
class Kid
{
int id;
Kid left;
Kid right;
}
class KidCircle
{
int count = 0;
Kid first;
Kid last;
KidCircle(int n){
for(int i = 0;i<n;i++){
add();
}
}
void add(){
Kid k = new Kid();
k.id = count;
if(count <= 0){
first = k;
last = k;
k.left = k;
k.right = k;
}else{
first.left = k;
last.right = k;
k.left = last;
k.right = first;
last=k;
}
count ++;
}
void delete(Kid k){
if(count <= 0){
return;
}else if(count == 1){
first = last = null;
}else{
k.left.right = k.right;
k.right.left = k.left;
if(k == first){
first = k.right;
}else if(k == last){
last = k.left;
}
}
count--;
}
}
0 0
- 用java解决约瑟夫问题
- java 解决约瑟夫问题
- 约瑟夫问题Java解决
- JAVA解决约瑟夫问题
- 用Java解决约瑟夫环问题
- python 用解决约瑟夫问题
- 用指针解决约瑟夫问题
- 用java实现链表并解决约瑟夫环问题
- java数组解决约瑟夫(Josephus)问题
- java 数组 解决 约瑟夫问题 算法
- JAVA简单解决约瑟夫环问题
- 用循环链解决解决约瑟夫问题
- 用Java实现约瑟夫问题
- 用数组法解决约瑟夫问题
- 用c解决约约瑟夫环问题
- 用数学算法解决约瑟夫环问题
- 用循环列表解决一个约瑟夫问题
- 解决约瑟夫问题
- linux下rpm完全干净卸载mysql
- Android的webView 实现点击超链接跳转,后退,前进 ,刷新
- 用ul、li做横向导航
- springmvc对restful风格的实现
- html学习之htm文件结构和标签
- 用java解决约瑟夫问题
- 南邮 OJ 1956 计算机基础知识大赛 3
- 从设计到实现,一步步教你实现Android-Universal-ImageLoader-解码与显示
- MFC中onctlcolor函数返回的画刷导致的内存资源泄露问题
- [贪心]hdu5355 多校联合第六场 Cake
- tnsping是否可以证明Oracle数据库可用?
- hadoop的理论技术(谷歌三大论文)
- 欢迎来到数据时代
- Memcache与Redis