<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    我的漫漫程序之旅

    專注于JavaWeb開發(fā)
    隨筆 - 39, 文章 - 310, 評論 - 411, 引用 - 0
    數(shù)據(jù)加載中……

    以順序表求解約瑟夫環(huán)問題的Java實(shí)現(xiàn)

    約瑟夫環(huán)(Josephus)問題:古代某法官要判決n個犯人的死刑,他有一條荒唐的法律,將犯人站成一個圓圈,從第s個人開始數(shù)起,每數(shù)到第d個犯人,就拉出來處決,然后再數(shù)d個,數(shù)到的人再處決……直到剩下的最后一個可赦免。
    LinearList:

    package com;
    /**
     * 線性表的存儲結(jié)構(gòu)
     * 
    @author zdw
     *
     
    */

    public class LinearList
    {
        
    private int table[]    ;
        
    private int n;
        
    //為順序表分配n個存儲單元
        public LinearList(int n)
        
    {
            
    //所占用的存儲單元個數(shù)this.table.length等于n
            table = new int[n];
            
    this.n  = 0;
        }

        
    //判斷順序表的是否為空
        public boolean isEmpty()
        
    {
            
    return n == 0;
        }

        
    //判斷順序表是否為滿
        public boolean isFull()
        
    {
            
    return n >= table.length;
        }

        
    //返回順序表長度
        public int length()
        
    {
            
    return n;
        }

        
    //獲得順序表的第i個數(shù)據(jù)元素值
        public int get(int i)
        
    {
            
    if(i > 0 && i <= n)
            
    {
                
    return table[i-1];
            }

            
    else
            
    {
                
    return -1;
            }

        }

        
    //設(shè)置順序表的第i個數(shù)據(jù)元素值
        public void set(int i ,int k)
        
    {
            
    if(i > 0 && i <= n + 1)
            
    {
                table[i 
    - 1= k;
                
    if(i == n + 1)
                
    {
                    n 
    ++;
                }

            }

        }

        
    //查找線性表是否包含k值
        public boolean contains(int k)
        
    {
            
    int j = indexof(k);
            
    if(j != -1)
                
    return true;
            
    else
                
    return false;
        }

        
    //查找k值,找到時返回位置,找不到返回-1
        private int indexof(int k)
        
    {
            
    int j = 0;
            
    while(j < n && table[j] != k)
            
    {
                j 
    ++;
            }

            
    if(j >= 0 && j < n)
            
    {
                
    return j;
            }

            
    else
            
    {
                
    return -1;
            }

        }

        
    //在順序表的第i個位置上插入數(shù)據(jù)元素
        public void insert(int i,int k)           //插入k值作為第i個值。
        {
            
    int j;
            
    if(!isFull())
            
    {
                
    if(i<=0) i=1;
                
    if(i>n) i=n+1;
                
    for(j=n-1;j>=i-1;j--)
                    table[j
    +1]=table[j];
                table[i
    -1]=k;
                n
    ++;
            }

            
    else
                System.out.println(
    "數(shù)組已滿,無法插入"+k+"值!");
        }

        
    public void insert(int k)                 //添加k值到順序表最后,重載
        {
            insert(n
    +1,k); 
        }

        
    //刪除順序表的第i個數(shù)據(jù)元素
        public void remove(int k)          //刪除k值首次出現(xiàn)的數(shù)據(jù)元素
        {
            
    int i=indexof(k);               //查找k值的位置
            if(i!=-1)
            
    {
                
    for(int j=i;j<n-1;j++)     //刪除第i個值
                    table[j]=table[j+1];
                table[n
    -1]=0;
                n
    --;
            }

            
    else
                System.out.println(k
    +"值未找到,無法刪除!");
        }


    }



    實(shí)現(xiàn)類:
    package com;

    public class Josephus
    {

        
    public static void main(String args[])
        
    {
            (
    new Josephus()).display(512);
        }


        
    public void display(int N, int S, int D)
        
    {
            
    final int NULL = 0;
            LinearList ring1 
    = new LinearList(N);
            
    int i, j, k;
            
    for (i = 1; i <= N; i++)
                
    // n個人依次插入線性表
                ring1.insert(i);
            
    // ring1.output();
            i = S - 1// 從第s個開始計數(shù)
            k = N;
            
    while (k > 1// n-1個人依次出環(huán)
            {
                j 
    = 0;
                
    while (j < D)
                
    {
                    i 
    = i % N + 1// 將線性表看成環(huán)形
                    if (ring1.get(i) != NULL)
                        j
    ++// 計數(shù)
                }

                System.out.println(
    "out :  " + ring1.get(i));
                ring1.set(i, NULL); 
    // 第i個人出環(huán),設(shè)置第i個位置為空
                k--;
                
    // ring1.output();
            }

            i 
    = 1;
            
    while (i <= N && ring1.get(i) == NULL)
                
    // 尋找最后一個人
                i++;
            System.out.println(
    "The final person is " + ring1.get(i));
        }


    }


    輸出結(jié)果如下:
    out :  2
    out :  
    4
    out :  
    1
    out :  
    5
    The 
    final person is 3


    posted on 2007-12-28 20:35 々上善若水々 閱讀(4752) 評論(0)  編輯  收藏 所屬分類: 數(shù)據(jù)結(jié)構(gòu)與算法

    主站蜘蛛池模板: 国产一区二区三区免费| 亚洲AV无码一区二区大桥未久| 亚洲色图综合在线| 国产精品亚洲片在线va| 1区2区3区产品乱码免费| 亚洲午夜免费视频| 久久久久亚洲精品成人网小说| 国产一级高青免费| 成熟女人特级毛片www免费| 久久久久久亚洲Av无码精品专口| 亚洲av无码专区在线电影天堂| 久久不见久久见中文字幕免费| 亚洲av成人一区二区三区在线观看| 久久久久亚洲AV综合波多野结衣 | 亚洲啪AV永久无码精品放毛片| 99免费精品视频| 亚洲AV永久纯肉无码精品动漫| 亚洲色大成网站WWW国产| 97无码免费人妻超级碰碰夜夜| 亚洲欧洲av综合色无码 | 国产精品亚洲视频| 中国好声音第二季免费播放| 亚洲gv猛男gv无码男同短文| 亚洲视频免费在线观看| 亚洲女同成人AⅤ人片在线观看| 国产免费A∨在线播放| 日韩免费高清视频网站| 久久亚洲精品国产精品| 精品熟女少妇AV免费观看| 亚洲avav天堂av在线网毛片| 亚洲一级黄色视频| 久久免费看少妇高潮V片特黄| 亚洲一级毛片免费在线观看| 四虎永久免费影院| 亚洲中文字幕久久久一区| 免费人妻无码不卡中文字幕18禁| 香蕉视频在线免费看| 亚洲成人福利在线观看| 国产一级特黄高清免费大片| 91在线免费观看| 亚洲国产精品免费观看 |