汉诺塔(Hanoi Tower)
汉诺塔(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
作为一个编程初学者,写下这些东西主要是为了加深自己的理解,当然如果能对各位有所帮助,是本人的荣幸。如有错误之处敬请指出。
汉诺塔 THE TOWER OF HANOI
THE TOWER OF HANOI 问题描述 汉诺塔(也称河内塔)是有法国数学家爱德华·卢卡斯于1883年发明的一道智力题。它源于印度的一个古老传说:大梵天创造世界的时候做了三根钻石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令一组牧师把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。据说牧师们夜以继日地工作,当他们完成任务时,那座塔就将坍塌,世界也将毁灭。 汉诺塔问题是这样规定的:如下图,一个由8个圆盘组成的塔,
Tower of Hanoi(汉诺塔)&详解
一个经典的汉诺塔问题,带着我自己的理解给做这个问题的友友们解决一下,包括我本人在做的时候也遇到的一些问题给大家阐述一下。话不多说,来看: 汉诺塔 问题描述: 汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。 分析问题: 将a柱上的盘子,
hanoi-tower.rar_汉诺塔
实现汉诺塔基本功能与搬运动画,让玩家自己玩游戏的过程
hanuo.rar_Hanoi_firev54_tower of hanoi_汉诺塔_游戏
汉诺塔游戏源码。也是网上高人奉献的。不敢独享。感谢大家


