国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 開(kāi)發(fā) > Java > 正文

java編程約瑟夫問(wèn)題實(shí)例分析

2024-07-13 10:15:30
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

一、簡(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é)果:

約瑟夫問(wèn)題,java編程

總結(jié)

以上就是本文關(guān)于java編程約瑟夫問(wèn)題實(shí)例分析的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到JAVA教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 温泉县| 札达县| 金塔县| 凌海市| 孙吴县| 罗甸县| 海安县| 斗六市| 东乡县| 称多县| 铁岭县| 克东县| 兰西县| 正蓝旗| 阿巴嘎旗| 江山市| 佳木斯市| 乡宁县| 马公市| 虞城县| 新兴县| 夏河县| 浮梁县| 西贡区| 施秉县| 巨鹿县| 九寨沟县| 新沂市| 新干县| 湖口县| 克什克腾旗| 建平县| 宣城市| 汕头市| 株洲县| 红桥区| 永善县| 凤城市| 龙江县| 包头市| 迁安市|