最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何利用Java遞歸解決“九連環(huán)”公式

 更新時(shí)間:2021年02月21日 08:50:48   作者:Alex_the_Dawn  
這篇文章主要給大家介紹了關(guān)于如何利用Java遞歸解決“九連環(huán)”公式的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

在之前有寫到過(guò)一點(diǎn)點(diǎn)有關(guān)遞歸的東西點(diǎn)擊打開(kāi)鏈接,然后想到小時(shí)候自己玩的一個(gè)玩具——九連環(huán)。小時(shí)候自己曾經(jīng)一邊玩一邊用筆記下來(lái)解開(kāi)這個(gè)東西的公式,那是十幾年前的事情了。前兩天突然想起來(lái),九連環(huán)的基本操作就是一個(gè)遞歸,一個(gè)感覺(jué)起來(lái)非常標(biāo)準(zhǔn)的遞歸過(guò)程。

九連環(huán)的玩法規(guī)則用一句話來(lái)概括就是:如果你想要卸掉某一環(huán)或者裝上某一環(huán),只需要保留這一環(huán)前面一環(huán),再之前所有的環(huán)都卸掉。(例如你想要卸掉或者裝上第9環(huán),那么保留第8環(huán),第8環(huán)之前的所有的環(huán)都卸掉)其中第一環(huán)可以直接卸掉。(其實(shí)第一第二這兩環(huán)可以一起裝上一起卸掉,我們?cè)谶壿嬌现皇且?guī)定第一環(huán)可以自由移動(dòng))

那么按照遞歸的思想來(lái)實(shí)現(xiàn)這個(gè)問(wèn)題,還是比較簡(jiǎn)單的。與之前提到的不同的是:這次對(duì)于某一環(huán)的操作不是一種,牽扯到裝上和卸掉兩種基本操作,所以針對(duì)九連環(huán)要設(shè)置一個(gè)標(biāo)記狀態(tài)——state:九連環(huán)在上,state=1;九連環(huán)在下,state=0 。這個(gè)在Node類中實(shí)現(xiàn)。(如同c++中的struct)

其中num屬性表示環(huán)號(hào),state表示環(huán)的狀態(tài)。

第二個(gè)需要準(zhǔn)備的就是利用ArrayList實(shí)現(xiàn)的一個(gè)棧,來(lái)將所有state=1的環(huán)壓入棧中。九連環(huán)規(guī)則中要求:要想對(duì)某一環(huán)進(jìn)行操作,要保證這一環(huán)的前一環(huán)state=1 且在棧頂。

第三個(gè)就是操作過(guò)程move,根據(jù)state的不同,設(shè)置move操作不同。

準(zhǔn)備條件做好了,就是要設(shè)計(jì)遞歸實(shí)現(xiàn)了。首先寫一下設(shè)計(jì)的思想(偽代碼)

play(n){
	n=1://基礎(chǔ)情形
		move(n);
	n>1:
		while(!deal)//沒(méi)有完成對(duì)這一環(huán)的操作
		{
			(n-1).state=1://前一環(huán)在上
				stack.pop=n-1://前一環(huán)為棧頂
					move(n);
					deal=true;
					stack.remove(size-2);//將第n環(huán)從棧中移走(并不是僅能夠在棧頂進(jìn)行操作的完全意義上的棧)
				stack.pop!=n-1://前一環(huán)不是棧頂
					for(i=n-2 to 1)
						find index where index.state!=0;//從大到小找到第一個(gè)在上的環(huán)(棧中在第n-1環(huán)之前的環(huán))
					play(index);//將這個(gè)發(fā)現(xiàn)的在上的環(huán)移走
			
			(n-1).state=0://前一環(huán)不在上
				play(n-1);//執(zhí)行對(duì)前一環(huán)的操作(即如果前一環(huán)在上就移走,如果不在上就裝上)	
		}
}

這個(gè)只是將某一環(huán)移走或者裝上的操作,如果將整個(gè)游戲都結(jié)束,在執(zhí)行函數(shù)的時(shí)候需要從高到低依次移走這些環(huán)。(見(jiàn)main函數(shù))。main函數(shù)中還需對(duì)九連環(huán)的初始狀態(tài)以及棧的初始狀態(tài)進(jìn)行初始化。(見(jiàn)main函數(shù))

運(yùn)行結(jié)果如下:(四個(gè)環(huán))

具體實(shí)現(xiàn),直接貼代碼:

import java.util.*;
public class NC {
	
	public static void move(Node node) {
		if(node.state==1)
			System.out.println("down "+node.num);
		else
			System.out.println("up "+node.num);
	}
	
	public void play(Node[]node,ArrayList<Node> list,int n) {
		boolean deal=false;
 
		if(n==1) {
			if(node[n].state==1)
			{
				move(node[n]);// move the 1st;
				node[n].state=0;
				list.remove(list.size()-1);
			}
			else
			{
				move(node[n]);
				node[n].state=1;
				list.add(node[n]);
			}
		}
		else {
			while(!deal)
			{
				if(node[n-1].state==1) {//前一環(huán)在上
					if(list.get(list.size()-1).num==n-1)//前一環(huán)為棧頂
					{
						if(node[n].state==1)
						{
							move(node[n]);
							node[n].state=0;
							deal=true;
							list.remove(list.size()-2);
						}
						else
						{
							move(node[n]);
							node[n].state=1;
							deal=true;
							list.add(list.size()-1,node[n]);
						}
					}
					else//前一環(huán)在上,但是前一環(huán)不是棧頂
					{
						int index=1;
						for(int i=n-2;i>0;i--)//找到前一環(huán)之前的所有在上的環(huán)中最大的一個(gè)。
						{
							if(node[i].state==1) {
								index=i;
								break;
							}
						}
						play(node,list,index);//將前一環(huán)之前的在上的最大的一環(huán)移走
					}
				}
				//-------------------------------------------------------------------------				
				else if(node[n-1].state==0) {//前一環(huán)不在上
					
					play(node,list,n-1);
			}
		}
	}
	
 
		
	}
	public static void main (String[]args) {
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		Node []node= new Node[n+1];
		for(int i=1;i<n+1;i++)
			node[i]=new Node(i,1);
		ArrayList<Node> list= new ArrayList();
		for(int j=n;j>0;j--)
			list.add(node[j]);
		NC nc= new NC();
		for(int t=n;t>0;t--)
			nc.play(node, list,t);		
	}
}
 
class Node{
	int num;
	int state;
	public Node(int num,int state) {
		this.num=num;
		this.state=state;
	}
}

總結(jié)

到此這篇關(guān)于如何利用Java遞歸解決“九連環(huán)”公式的文章就介紹到這了,更多相關(guān)Java遞歸“九連環(huán)”公式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 深入解析Spring Bean初始化時(shí)和銷毀時(shí)的擴(kuò)展點(diǎn)

    深入解析Spring Bean初始化時(shí)和銷毀時(shí)的擴(kuò)展點(diǎn)

    在Bean進(jìn)行初始化或者銷毀的時(shí)候,如果我們需要做一些操作,比如加載和銷毀一些資源或者執(zhí)行一些方法時(shí),那么就可以使用Spring提供的一些擴(kuò)展,今天主要分享初始化Bean時(shí)的三種方式和銷毀Bean時(shí)的三種方式,需要的朋友可以參考下
    2023-08-08
  • 移動(dòng)指定文件夾內(nèi)的全部文件

    移動(dòng)指定文件夾內(nèi)的全部文件

    移動(dòng)指定文件夾內(nèi)的全部文件
    2009-01-01
  • 客戶端設(shè)置超時(shí)時(shí)間真的很重要

    客戶端設(shè)置超時(shí)時(shí)間真的很重要

    今天小編就為大家分享一篇關(guān)于客戶端設(shè)置超時(shí)時(shí)間真的很重要,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-12-12
  • 深入聊一聊springboot項(xiàng)目全局異常處理那些事兒

    深入聊一聊springboot項(xiàng)目全局異常處理那些事兒

    最近在做項(xiàng)目時(shí)需要對(duì)異常進(jìn)行全局統(tǒng)一處理,所以下面這篇文章主要給大家介紹了關(guān)于springboot項(xiàng)目全局異常處理那些事兒,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-01-01
  • 數(shù)組實(shí)現(xiàn)Java 自定義Queue隊(duì)列及應(yīng)用操作

    數(shù)組實(shí)現(xiàn)Java 自定義Queue隊(duì)列及應(yīng)用操作

    這篇文章主要介紹了數(shù)組實(shí)現(xiàn)Java 自定義Queue隊(duì)列及應(yīng)用操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java數(shù)組動(dòng)態(tài)增加容量過(guò)程解析

    Java數(shù)組動(dòng)態(tài)增加容量過(guò)程解析

    這篇文章主要介紹了Java數(shù)組動(dòng)態(tài)增加容量過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • SpringBoot整合Swagger2的示例

    SpringBoot整合Swagger2的示例

    這篇文章主要介紹了SpringBoot整合Swagger2的示例,幫助大家更好的理解和學(xué)習(xí)springboot框架,感興趣的朋友可以了解下
    2020-11-11
  • SpringBoot實(shí)現(xiàn)滑塊驗(yàn)證碼驗(yàn)證登陸校驗(yàn)功能詳解

    SpringBoot實(shí)現(xiàn)滑塊驗(yàn)證碼驗(yàn)證登陸校驗(yàn)功能詳解

    驗(yàn)證碼作為一種自然人的機(jī)器人的判別工具,被廣泛的用于各種防止程序做自動(dòng)化的場(chǎng)景中。傳統(tǒng)的字符型驗(yàn)證安全性已經(jīng)名存實(shí)亡的情況下,各種新型的驗(yàn)證碼如雨后春筍般涌現(xiàn),今天給大家分享一篇SpringBoot實(shí)現(xiàn)滑塊驗(yàn)證碼
    2022-09-09
  • Java對(duì)int[]數(shù)組做新增刪除去重操作代碼

    Java對(duì)int[]數(shù)組做新增刪除去重操作代碼

    這篇文章主要介紹了Java里面對(duì)int[]數(shù)組做新增刪除去重實(shí)現(xiàn),這里記錄下使用int[]數(shù)組對(duì)數(shù)組進(jìn)行新增刪除去重等操作,用來(lái)更加了解java里面的集合類思想,需要的朋友可以參考下
    2023-10-10
  • Java編寫實(shí)現(xiàn)多人聊天室

    Java編寫實(shí)現(xiàn)多人聊天室

    這篇文章主要為大家詳細(xì)介紹了Java編寫實(shí)現(xiàn)多人聊天室,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-09-09

最新評(píng)論

崇仁县| 巢湖市| 赤峰市| 于田县| 中牟县| 栖霞市| 青浦区| 怀安县| 福泉市| 承德市| 天水市| 和林格尔县| 张北县| 阳泉市| 彝良县| 泰安市| 普宁市| 敖汉旗| 九寨沟县| 中超| 绵竹市| 洪江市| 昭苏县| 沙洋县| 岫岩| 岗巴县| 岳阳县| 文安县| 澄江县| 乌海市| 黄平县| 海淀区| 德清县| 河间市| 东至县| 天峨县| 兰坪| 同江市| 揭西县| 色达县| 施秉县|