雷火电竞-中国电竞赛事及体育赛事平台

歡迎來(lái)到入門(mén)教程網(wǎng)!

Java編程

當(dāng)前位置:主頁(yè) > 軟件編程 > Java編程 >

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

來(lái)源:本站原創(chuàng)|時(shí)間:2020-01-10|欄目:Java編程|點(diǎn)擊:

一、簡(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

網(wǎng)頁(yè)制作CMS教程網(wǎng)絡(luò)編程軟件編程腳本語(yǔ)言數(shù)據(jù)庫(kù)服務(wù)器

如果侵犯了您的權(quán)利,請(qǐng)與我們聯(lián)系,我們將在24小時(shí)內(nèi)進(jìn)行處理、任何非本站因素導(dǎo)致的法律后果,本站均不負(fù)任何責(zé)任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有