【Java程序】約瑟夫環

今天看視頻教程無心間看到了一個數3減1的問題,百度之發現叫約瑟夫環問題,因而寫了程序,問題大體描述以下:數據結構

一羣帶有編號的孩子手拉手圍成一個圈報數,開始的孩子數1,他右邊數2,再右邊數3,數到n的孩子out,接着從下一個孩子開始繼續數1,數到n的孩子out,如此循環...問最後留下來的孩子是原來的多少號?ui

我這裏用Java寫了一個雙向迴環鏈表表明圍成的圈,其中的Kid是一個鏈表節點,他有一個左同胞,一個右同胞,還有一個id。雙向會還鏈表定義了添加節點方法add(),刪去節點方法delete();隊首孩子firstKid,隊尾孩子LastKid,還有表的長度count。spa

class Kidcircle{
    private int count;
    Kid firstKid;
    Kid LastKid;
    Kidcircle(int num){
        count = 0;
        for(int i=0;i<num;i++){
            add();
        }
    }
    private void add(){
        Kid k = new Kid();    
        k.id = count+1;
        if(count==0){        
            LastKid = k;
            firstKid = k;
        } else {
            k.left = LastKid;
            k.right = firstKid;
            LastKid.right = k;
            firstKid.left = k;
            LastKid = k;
        }
        count++;
    }
    public void delete(Kid k){
        if(count<=1){
            return;
        } else {
            count--;
            k.left.right = k.right;
            k.right.left = k.left;
            if(k == firstKid){
                firstKid = k.right;
            }else if(k==LastKid){
                LastKid = k.left;
            }
        }
    }
    public int getSize(){
        return count;
    }
}

Kid類以下:code

class Kid{
    Kid left;
    Kid right;
    int id;
}

而後main方法中這麼寫的,我假設的是數到3淘汰一個孩子,而後一共500人:視頻

public class count3quit {
    public static void main(String[] args){
        Kidcircle Kc = new Kidcircle(500);
        Kid currentKid = Kc.firstKid;
        while(Kc.getSize()>1){
            Kc.delete(currentKid.right.right);
            currentKid = currentKid.right.right;
        }
        System.out.println(Kc.firstKid.id);
    }
}

最後結果:436。blog

有時間仍是要多回顧數據結構中的東西。教程

相關文章
相關標籤/搜索