打印

汉诺塔

[复制链接]
1127|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gaoyang9992006|  楼主 | 2015-10-19 22:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。








相关帖子

沙发
gaoyang9992006|  楼主 | 2015-10-19 22:11 | 只看该作者






function XhanX(n,a,c,t)
%调用格式XhanX(n,a,c,t)
%n为铁块个数,开始都叠在a号杆上,
%要把他们移到c号杆上去,a、c=1,2,3;
%t为时间(帧数)大于0,建议小于30,如果n大于5,t小于15,n大于8,t小于3
%如果t取0则为游戏模式!游戏模式!游戏模式!
%by 桀作 2013.7
global var A cd N h h1 v T X
%A由每个铁块的结构体组成的数组
%cd(i,:)第i根杆子上的铁块序号的数组
%var(i)第i根杆子上的铁块数
%h为铁块的总高
%h1每块的高
%v(i)第i跟杆子的中心位置
%N=n;
%T为时间,帧数。如果T取0,则为游戏模式
%X为字符串
try
var(a)=n;var(c)=0;var(6-a-c)=0;
h=100;h1=100/n;d=1;v(1)=2+n;v(2)=(2+n)*2;v(3)=(2+n)*3;cd(a,:)=1:n;N=n;T=t;
for i=1:n
A(i).xingzhuang1=[v(a)-(n+2-i)/2,v(a)+(n+2-i)/2,v(a)+(n+2-i)/2,v(a)-(n+2-i)/2];
A(i).xingzhuang2=[0,0,h1,h1];
A(i).gaodu=i;
end
figure;
if T==0
    X=['请将',num2str(a),'上的所有铁块移到',num2str(c),'杆子上去。'];T=6;g();Xhanc(c);
else
    X=['自动模式'];g();pause(1);Xhan(n,a,c);
end
clear global
catch
    clear global
end




function Xhanc(c)
%游戏模式
try
global N var cd A
while 1
while 1
k=waitforbuttonpress;
p1=get(gca, 'currentpoint');
q1=ceil((p1(1,1)-N/2-1)/(N+2));
if q1<=3&q1>=1&var(q1)~=0
    A(cd(q1,var(q1))).gaodu=var(q1)+1;
    g();
    break;
end
end
while 1
k=waitforbuttonpress;
p2=get(gca, 'currentpoint');
q2=ceil((p2(1,1)-N/2-1)/(N+2));
if q2<=3 & q2>=1
    break;
end
end
if q1==q2
    A(cd(q1,var(q1))).gaodu=var(q1);
    g();
    continue;
end
if var(q2)>0 & cd(q1,var(q1))<cd(q2,var(q2))
A(cd(q1,var(q1))).gaodu=var(q1);
g();
continue;
end
f(q1,q2);
if var(c)==N
    xlabel('成功通关!!!','fontsize',18,'color','r');
    return;
end
end
catch
    clear global
end



function Xhan(n,a,c)
%核心算法,将n个从a移到c上去
if n==1
f(a,c);
else b=6-a-c;
Xhan(n-1,a,b)
f(a,c);
Xhan(n-1,b,c)
end

function f(a,c)
%将a杆上最上方的铁块移到c杆最上方
try
global var cd A v N T
high=ceil(1.5*N)+1;p=ceil(T/2);q=ceil(T);
m=(high-A(cd(a,var(a))).gaodu)/q;
xx=(v(c)-v(a))/p;
var(c)=var(c)+1;n=(high-var(c))/q;
cd(c,var(c))=cd(a,var(a));
for i=1:q
A(cd(a,var(a))).gaodu=A(cd(a,var(a))).gaodu+m;
g();
end
for i=1:p
A(cd(a,var(a))).xingzhuang1=A(cd(a,var(a))).xingzhuang1+xx;
g();
end
for i=1:q;
A(cd(a,var(a))).gaodu=A(cd(a,var(a))).gaodu-n;
g()
end
cd(a,var(a))=0;
var(a)=var(a)-1;
catch
   clear global;
end
function g()  
%画出目前的图形
global T v h h1 N A X
clf
axis([-0.1,4*(N+2),0,2*h])
set(gca,'YColor',[1 1 1],'YTick',[],'XColor',[1 1 1],'XTick',[]);
title('汉诺塔','fontsize',20);
xlabel(X,'fontsize',18,'color','r');
hold on;
plot([0,4*(N+2)],[0,0],'-y','linewidth',10)
for i=1:3
fill([v(i)-0.5,v(i)+0.5,v(i)+0.5,v(i)-0.5],[0,0,1.5*h,1.5*h],'m');
end
for i=1:N
fill(A(i).xingzhuang1,A(i).xingzhuang2+(A(i).gaodu-1)*h1,'c');
end
plot([0,4*(N+2)],[0,0],'-y','linewidth',5)
pause(0.001);
   

使用特权

评论回复
板凳
lvyunhua| | 2015-12-19 21:35 | 只看该作者
经典题目!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1974

主题

15994

帖子

210

粉丝