⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sunnypig闯罗塔关.pas

📁 vijos上一题Sunnypig闯罗塔关(汉诺塔问题中最难的一种问法)。 没做出来的可以参考一下。
💻 PAS
字号:
program han;
type
shu=array[0..100] of longint;
var
hanoita:array[0..200,false..true] of shu;
s:string;
f:array[0..200] of shu;
a:array[0..200] of longint;
i,j,k,n,m:longint;
use:boolean;
ans:shu;

operator *(b:longint;a:shu)c:shu;
var
i,k:longint;
begin
fillchar(c,sizeof(c),0);
k:=0;
for i:=1 to a[0] do
     begin
     k:=k+a[i]*b;
     c[i]:=k mod 10000;
     k:=k div 10000;
     end;
c[0]:=a[0];
if k<>0 then
     begin
     inc(c[0]);
     c[c[0]]:=k;
     end;
end;

operator +(a:shu;b:longint)c:shu;
var
i,k:longint;
begin
fillchar(c,sizeof(c),0);
k:=b;
for i:=1 to a[0] do
     begin
     k:=k+a[i];
     c[i]:=k mod 10000;
     k:=k div 10000;
     end;
c[0]:=a[0];
if k<>0 then
     begin
     inc(c[0]);
     c[c[0]]:=k;
     end;
end;

operator +(a,b:shu)c:shu;
var
i,k,t:longint;
begin
fillchar(c,sizeof(c),0);
k:=0;
if a[0]>b[0] then t:=a[0] else t:=b[0];
for i:=1 to t do
     begin
     if i<=a[0] then k:=k+a[i];
     if i<=b[0] then k:=k+b[i];
     c[i]:=k mod 10000;
     k:=k div 10000;
     end;
c[0]:=t;
if k<>0 then
     begin
     inc(c[0]);
     c[c[0]]:=k;
     end;
end;

function change(x:longint):shu;
begin
fillchar(change,sizeof(change),0);
change[0]:=1;
change[1]:=x;
end;

procedure writelnshu(a:shu);
var
i:longint;
begin
write(a[a[0]]);
for i:=a[0]-1 downto 1 do
     begin
     write(a[i] div 1000);
     a[i]:=a[i] mod 1000;
     write(a[i] div 100);
     a[i]:=a[i] mod 100;
     write(a[i] div 10);
     write(a[i] mod 10);
     end;
writeln;
end;

function hanoi(n:longint;flag:boolean):shu;
begin
if n=1 then
     case a[1] of
     1: if flag then exit(change(0)) else exit(change(2));
     2: exit(change(1));
     3: if flag then exit(change(2)) else exit(change(0));
     end;


case a[n] of
1:   begin
     if flag then hanoi:=hanoita[n-1,true]
     else hanoi:=2*f[n-1]+2+hanoita[n-1,false];
     end;

2:   hanoi:=f[n-1]+1+hanoita[n-1,not flag];

3:   begin
     if flag then hanoi:=2*f[n-1]+2+hanoita[n-1,true]
     else hanoi:=hanoita[n-1,false];
     end;
end;

end;

begin
f[0]:=change(0);
for i:=1 to 200 do
     begin
     f[i]:=f[i-1];
     f[i]:=f[i]+f[i-1];
     f[i]:=f[i]+f[i-1];
     f[i]:=f[i]+2;
     end;


readln(n);
while n<>0 do
begin
readln(s);
for i:=1 to n do
     a[i]:=ord(s[n-i+1])-64;
for i:=1 to n-1 do
     begin
     hanoita[i,true]:=hanoi(i,true);
     hanoita[i,false]:=hanoi(i,false);
     end;
ans:=hanoi(n,true);
writelnshu(ans);
readln(n);
end;
end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -