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

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

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

    我的漫漫程序之旅

    專注于JavaWeb開發
    隨筆 - 39, 文章 - 310, 評論 - 411, 引用 - 0
    數據加載中……

    以順序表求解約瑟夫環問題的Java實現

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

    package com;
    /**
     * 線性表的存儲結構
     * 
    @author zdw
     *
     
    */

    public class LinearList
    {
        
    private int table[]    ;
        
    private int n;
        
    //為順序表分配n個存儲單元
        public LinearList(int n)
        
    {
            
    //所占用的存儲單元個數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個數據元素值
        public int get(int i)
        
    {
            
    if(i > 0 && i <= n)
            
    {
                
    return table[i-1];
            }

            
    else
            
    {
                
    return -1;
            }

        }

        
    //設置順序表的第i個數據元素值
        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個位置上插入數據元素
        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(
    "數組已滿,無法插入"+k+"值!");
        }

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

        
    //刪除順序表的第i個數據元素
        public void remove(int k)          //刪除k值首次出現的數據元素
        {
            
    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
    +"值未找到,無法刪除!");
        }


    }



    實現類:
    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個開始計數
            k = N;
            
    while (k > 1// n-1個人依次出環
            {
                j 
    = 0;
                
    while (j < D)
                
    {
                    i 
    = i % N + 1// 將線性表看成環形
                    if (ring1.get(i) != NULL)
                        j
    ++// 計數
                }

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

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


    }


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


    posted on 2007-12-28 20:35 々上善若水々 閱讀(4748) 評論(0)  編輯  收藏 所屬分類: 數據結構與算法

    主站蜘蛛池模板: 亚洲国产视频久久| 免费的全黄一级录像带| 人人狠狠综合久久亚洲88| 91精品免费观看| 亚洲成a人无码亚洲成www牛牛 | 久久精品国产亚洲7777| 亚欧免费无码aⅴ在线观看| 亚洲精品一卡2卡3卡四卡乱码| 久久综合亚洲色HEZYO国产| 手机看黄av免费网址| 中文字幕在线视频免费观看| 亚洲剧场午夜在线观看| 中文字幕亚洲专区| 无码人妻久久一区二区三区免费丨| 亚洲阿v天堂在线2017免费| 亚洲xxxx18| 亚洲av丰满熟妇在线播放| 免费一级特黄特色大片在线观看| 无码国产精品一区二区免费vr| 羞羞漫画页面免费入口欢迎你| 亚洲无圣光一区二区| 亚洲日韩精品一区二区三区| 午夜私人影院免费体验区| 特级无码毛片免费视频尤物| 免费人妻精品一区二区三区| 亚洲国产日韩精品| 一区二区三区亚洲| 久久久久久A亚洲欧洲AV冫| 午夜两性色视频免费网站| 最近最新高清免费中文字幕| 国产精品免费一区二区三区 | 精品一区二区三区高清免费观看| 亚洲xxxx视频| 亚洲综合综合在线| 亚洲av永久无码精品网站| 五月天婷亚洲天综合网精品偷| 两个人的视频高清在线观看免费| 久久久久久夜精品精品免费啦| 精品人妻系列无码人妻免费视频| 99亚洲男女激情在线观看| 亚洲中文字幕无码一去台湾|