java編程約瑟夫問(wèn)題實(shí)例分析
一、簡(jiǎn)介
約瑟夫問(wèn)題(有時(shí)也稱為約瑟夫斯置換,是一個(gè)出現(xiàn)在計(jì)算機(jī)科學(xué)和數(shù)學(xué)中的問(wèn)題。在計(jì)算機(jī)編程的算法中,類似問(wèn)題又稱為約瑟夫環(huán)。又稱“丟手絹問(wèn)題”.)
例子:
len個(gè)人圍成一個(gè)圈,玩丟手絹游戲。從第k個(gè)人開(kāi)始,從1開(kāi)始數(shù)數(shù),當(dāng)數(shù)到m時(shí),數(shù)m的人就退出圈子,當(dāng)圈子只剩下一個(gè)人為止。
問(wèn)題分析與算法設(shè)計(jì)
約瑟夫問(wèn)題并不難,但求解的方法很多;題目的變化形式也很多。這里給出一種實(shí)現(xiàn)方法。
題目中l(wèi)en個(gè)人圍成一圈,因而啟發(fā)我們用一個(gè)循環(huán)的鏈來(lái)表示,可以使用結(jié)構(gòu)數(shù)組來(lái)構(gòu)成一個(gè)循環(huán)鏈。結(jié)構(gòu)中有兩個(gè)成員,其一為指向第一個(gè)孩子的頭節(jié)點(diǎn),另一個(gè)為作為判斷的節(jié)點(diǎn)temp(負(fù)責(zé)跑龍?zhí)祝?/p>
具體代碼如下:
package demo11;
/**
      * 約瑟夫問(wèn)題, 化為丟手絹
      * 
      * @author tianq 思路:建立一個(gè)Child類 一個(gè)循環(huán)列表類CyclLink
      */
public class demo11 {
	public static void main(String[] args) {
		CyclLink cyclink = new CyclLink();
		cyclink.setLen(15);
		cyclink.createLink();
		cyclink.setK(2);
		cyclink.setM(2);
		cyclink.show();
		cyclink.play();
	}
}
// 先建立一個(gè)孩子類
class Child {
	// 孩子的標(biāo)識(shí)
	int no;
	Child nextChild;
	// 指向下一個(gè)孩子
	public Child(int no) {
		// 構(gòu)造函數(shù)給孩子一個(gè)id
		this.no = no;
	}
}
class CyclLink {
	// 先定義一個(gè)指向鏈表第一個(gè)小孩的引用
	// 指向第一個(gè)小孩的引用,不能動(dòng)
	Child firstChild = null;
	Child temp = null;
	int len = 0;
	// 表示共有幾個(gè)小孩
	int k = 0;
	//開(kāi)始的孩子
	int m = 0;
	//數(shù)到幾推出
	// 設(shè)置m
	public void setM(int m) {
		this.m = m;
	}
	// 設(shè)置鏈表的大小
	public void setLen(int len)
	  {
		this.len = len;
	}
	// 設(shè)置從第幾個(gè)人開(kāi)始數(shù)數(shù)
	public void setK(int k) {
		this.k = k;
	}
	// 開(kāi)始play
	public void play() {
		Child temp = this.firstChild;
		// 1.先找到開(kāi)始數(shù)數(shù)的人
		for (int i = 1; i < k; i++) {
			temp = temp.nextChild;
		}
		while (this.len != 1) {
			// 2.數(shù)m下
			for (int j = 1; j < m; j++) {
				temp = temp.nextChild;
			}
			// 找到要出圈的前一個(gè)小孩
			Child temp2 = temp;
			while (temp2.nextChild != temp) {
				temp2 = temp2.nextChild;
			}
			// 3.將數(shù)到m的小孩,退出
			temp2.nextChild = temp.nextChild;
			// 讓temp指向下一個(gè)數(shù)數(shù)的小孩
			temp = temp.nextChild;
			// this.show();
			this.len--;
		}
		// 最后一個(gè)小孩
		System.out.println("最后出圈" + temp.no);
	}
	// 初始化環(huán)形鏈表
	public void createLink() {
		for (int i = 1; i <= len; i++) {
			if (i == 1) {
				// 創(chuàng)建第一個(gè)小孩
				Child ch = new Child(i);
				this.firstChild = ch;
				this.temp = ch;
			} else {
				if (i == len) {
					// 創(chuàng)建第一個(gè)小孩
					Child ch = new Child(i);
					temp.nextChild = ch;
					temp = ch;
					temp.nextChild = this.firstChild;
				} else {
					// 繼續(xù)創(chuàng)建小孩
					Child ch = new Child(i);
					temp.nextChild = ch;
					temp = ch;
				}
			}
		}
	}
	// 打印該環(huán)形鏈表
	public void show() {
		Child temp = this.firstChild;
		do {
			System.out.print(temp.no + " ");
			temp = temp.nextChild;
		}
		while (temp != this.firstChild);
	}
}
結(jié)果:
總結(jié)
以上就是本文關(guān)于java編程約瑟夫問(wèn)題實(shí)例分析的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!
上一篇:java編程實(shí)現(xiàn)求質(zhì)數(shù)與因式分解代碼分享
欄 目:Java編程
下一篇:Java編程實(shí)現(xiàn)基于圖的深度優(yōu)先搜索和廣度優(yōu)先搜索完整代碼
本文標(biāo)題:java編程約瑟夫問(wèn)題實(shí)例分析
本文地址:http://www.jygsgssxh.com/a1/Javabiancheng/8373.html
您可能感興趣的文章
- 01-10Java咖啡館(1)——嘆咖啡
 - 01-10Java Socket編程(三) 服務(wù)器Sockets
 - 01-10Java進(jìn)階:Struts多模塊的技巧
 - 01-10Java Socket編程(一) Socket傳輸模式
 - 01-10Java Socket編程(二) Java面向連接的類
 - 01-10Java運(yùn)行時(shí)多態(tài)性的實(shí)現(xiàn)
 - 01-10Java經(jīng)驗(yàn)點(diǎn)滴:處理沒(méi)有被捕獲的異常
 - 01-10Java Socket編程(四) 重復(fù)和并發(fā)服務(wù)器
 - 01-10Java中的浮點(diǎn)數(shù)分析
 - 01-10面向?qū)ο缶幊?Java中的抽象數(shù)據(jù)類型
 


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
 - 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
 - 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
 - 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
 - 5c語(yǔ)言計(jì)算三角形面積代碼
 - 6什么是 WSH(腳本宿主)的詳細(xì)解釋
 - 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
 - 8正則表達(dá)式匹配各種特殊字符
 - 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
 - 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
 
本欄相關(guān)
- 01-10Java咖啡館(1)——嘆咖啡
 - 01-10JVM的垃圾回收機(jī)制詳解和調(diào)優(yōu)
 - 01-10Java Socket編程(三) 服務(wù)器Sockets
 - 01-10Java進(jìn)階:Struts多模塊的技巧
 - 01-10J2SE 1.5版本的新特性一覽
 - 01-10Java Socket編程(一) Socket傳輸模式
 - 01-10Java運(yùn)行時(shí)多態(tài)性的實(shí)現(xiàn)
 - 01-10Java Socket編程(二) Java面向連接的類
 - 01-10Java Socket編程(四) 重復(fù)和并發(fā)服務(wù)
 - 01-10Java經(jīng)驗(yàn)點(diǎn)滴:處理沒(méi)有被捕獲的異常
 
隨機(jī)閱讀
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
 - 01-11Mac OSX 打開(kāi)原生自帶讀寫(xiě)NTFS功能(圖文
 - 01-10delphi制作wav文件的方法
 - 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
 - 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
 - 01-10C#中split用法實(shí)例總結(jié)
 - 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
 - 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
 - 04-02jquery與jsp,用jquery
 - 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
 


