约瑟夫杀人法

作者: hipeer | 来源:发表于2018-09-24 15:55 被阅读0次

约瑟夫问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。

利用单项循环链表解决
public class Josephus {
    // 游戏人数
    private static int Numbers = 10;
    // 间隔
    private static int Gap = 3;
    
    // 节点类
    class Node<T>{
        T value;
        Node<T> next;
        
        public T getValue() {
            return value;
        }
        
        public void setValue(T value) {
            this.value = value;
        }
    }
    
    public void killPerson(){
        // 创建头节点
        Node<Integer> head = new Node<Integer>();
        head.setValue(1);
        // 让指针指向head
        Node<Integer> pointer = head;
        // 构造循环链表
        for(int i = 2; i <= Numbers; i++){
            Node<Integer> node = new Node<Integer>();
            node.setValue(i);
            pointer.next = node;
            pointer = pointer.next;
        }
        // 最后一个节点指向头节点,这样就构造出了一个单向循环链表
        pointer.next = head;
        
        // 开始杀人
        // 当只剩一个节点时,pointer和pointer指向的节点的next就都指向这最后一个节点了,
        // 所以循环结束条件即为pointer != poiinter.next 
        while(pointer != pointer.next){
            // 从1数到Gap, 此时指针只移动Gap-1次,下一个就是要干掉的节点
            for(int i = 1; i < Gap; i++){
                pointer = pointer.next;
            }
            // 打印下一个节点的值
            System.out.println(pointer.next.getValue() + "被干掉了");
            // 让当前pointer指针指向的节点的next指针指向下一个节点(就是要被干掉的节点)的下一个节点
            // 这样就把节点干掉了
            pointer.next = pointer.next.next;
        }
        System.out.println("只剩" + pointer.getValue() + "活着了");
    }
    
    public static void main(String[] args){
        Josephus josephus = new Josephus();
        josephus.killPerson();
    }
}

相关文章

  • 约瑟夫杀人法

    约瑟夫问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。 利用单项循环链表解决

  • 约瑟夫杀人法

    约瑟夫杀人法是这样一个场景:一群人手拉手围成一个圈,依次数数,数到特定的数的那个人就被枪毙,然后他的前后的人手拉手...

  • C语言——第三次笔记

    学习内容(涉及到后面的指针,内存部分的可以先了解性的看看)#define的使用约瑟夫生者死者小游戏(杀人游戏)实战...

  • 花式借刀杀人法

    都TM想借刀杀人 都TM不想自己上场 让我们来看看花式借刀杀人法 都TM借刀杀人了,还不给你刀 都TM借刀杀人了,...

  • 约瑟夫环: 一个杀人游戏算法

    循环链表 把链表的两头连接,使其成为了一个环状链表,通常称为循环链表。 和它名字的表意一样,只需要将表中最后一个节...

  • 约瑟夫环——公式法(递推公式)

    传送门:https://blog.csdn.net/u011500062/article/details/7285...

  • 数独杀人法

    (1) 星期日是个晴朗的一天,恶棍张三约罗氓在简单咖啡馆碰面。 此人在花竹园小区臭名昭著,偷摸拐骗样样在行,简直是...

  • 救贫黄泉与杀人大黄泉水法

    救贫黄泉与杀人大黄泉水法 文/陈益峰 风水地理学中,关于救贫黄泉与杀人大黄泉水法,论述极多,很多名师都在写文章说这...

  • 算法学习 - Python(持续更新)

    二分查找法 - 递归实现 约瑟夫环问题 汉诺塔问题(递归) 旋转列表(Python):列表原地修改,参考Leetc...

  • 顶级大师写生示范,第一个就美曝了

    1 约瑟夫 Joseph Zbukvic 约瑟夫 出生于克罗地亚, 后移民澳大利亚。 约瑟夫(Joseph Zb...

网友评论

    本文标题:约瑟夫杀人法

    本文链接:https://www.haomeiwen.com/subject/kmacoftx.html