汉诺塔(Hanoi Tower)

weixin_48792829 weixin_48792829 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根子上从下往上按照大小顺序摞着n片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子.子上从下往上按照大小顺序摞着n片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子.并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。问应该如何操作?

 

1、将n-1个盘子从A柱移动到B柱

2、将A柱底下最大的盘子移动至C柱

3、将B柱的n-1个盘子移动至C柱

package Hanoi;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;

public class AI {
		private static Set<String> list=new HashSet<String>();//保存已经出现过的状态
		private static ArrayList<String> slist=new ArrayList<String>();//保存解状态
		public static void main(String[] args) {
			//建立初始状态
			Ta[] ts=new Ta[2];
			Gan[] gs=new Gan[3];
			StringBuilder sb=new StringBuilder();
			for(int i=0;i<ts.length;i++) {
				ts[i]=new Ta(i,(char)(i+'A')+"",0);
				sb.append(0);
			}
			list.add(sb.toString());
			for(int i=0;i<3;i++) {
				gs[i]=new Gan();
			}
			
			dfs(ts,gs,0);
			//打印解状态
			System.out.println(slist);
		}
		public static boolean dfs(Ta[] ts,Gan[] gs,int index) {
			for(int j=0;j<3;j++) {
				if(ts[index].index!=j) {
					int now=ts[index].index;
					StringBuilder sb=new StringBuilder();
					for(Ta t:ts) {
						if(t!=ts[index])
							sb.append(t.index);
						else 
							sb.append(j);
					}
					if(ts[index].size<gs[j].getTopSize()) {
						boolean flag=false;
						for(String s:list) {
							if(s.equals(sb.toString())) {
								flag=true;
								break;
							}
						}
						if(!flag) {
							//移动到j
						ts[index].index=j;
						gs[now].list.remove(ts[index]);
						gs[j].list.add(ts[index]);
						list.add(sb.toString());
						slist.add(ts[index].name+"移动到"+(ts[index].index+1));
						boolean f=false;
						for(int i=0;i<ts.length;i++) {//回溯
							if(i!=index)
								{
								f=dfs(ts,gs,i);//递归
									if(f) {
										return true;
									}
								}
						}
						//成功条件
						if(gs[1].list.size()==ts.length&&gs[1].getTop()==ts[0]) {
							return true;
						}
						//放回原位
						gs[j].list.remove(ts[index]);
						ts[index].index=now;
						//slist.add(ts[index].name+"移动到"+now);
					}
					}
				}
			}
			return false;
		}
	}
	/**
	 * 汉诺塔
	 * @author zyf
	 *
	 */
	class Ta{
		int size;//尺寸
		String name;
		int index;//在第index个杆子上
		public Ta(int size, String name, int index) {
			this.size = size;
			this.name = name;
			this.index = index;
		}
	}
	/**
	 * 柱子
	 * @author zyf
	 *
	 */
	class Gan{
		ArrayList<Ta> list=new ArrayList<Ta>();
		public boolean isEmp() {
			return list.size()==0;
		}
		public int getTopSize() {
			if(!isEmp())
				return list.get(list.size()-1).size;
			return Integer.MAX_VALUE;
		}
		public Ta getTop() {
			if(!isEmp())
				return list.get(list.size()-1);
			return null;
		}

}

 

 

...全文

相关推荐

Hanoi Tower 汉诺塔问题/c

作为一个编程初学者,写下这些东西主要是为了加深自己的理解,当然如果能对各位有所帮助,是本人的荣幸。如有错误之处敬请指出。

weixin_38665449

汉诺塔 THE TOWER OF HANOI

THE TOWER OF HANOI 问题描述 汉诺塔(也称河内塔)是有法国数学家爱德华·卢卡斯于1883年发明的一道智力题。它源于印度的一个古老传说:大梵天创造世界的时候做了三根钻石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令一组牧师把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。据说牧师们夜以继日地工作,当他们完成任务时,那座塔就将坍塌,世界也将毁灭。 汉诺塔问题是这样规定的:如下图,一个由8个圆盘组成的塔,

CoderRuL

Tower of Hanoi(汉诺塔)&详解

一个经典的汉诺塔问题,带着我自己的理解给做这个问题的友友们解决一下,包括我本人在做的时候也遇到的一些问题给大家阐述一下。话不多说,来看: 汉诺塔 问题描述: 汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。 分析问题: 将a柱上的盘子,

DHL10

hanoi-tower.rar_汉诺塔

实现汉诺塔基本功能与搬运动画,让玩家自己玩游戏的过程

weixin_42653672

hanuo.rar_Hanoi_firev54_tower of hanoi_汉诺塔_游戏

汉诺塔游戏源码。也是网上高人奉献的。不敢独享。感谢大家

Kinonoyomeo
评论 1
收藏 已收藏
分享
返回顶部