程序:
program tjcoi1_2; { Write by Li Xuewu }
var
ga,gb,gc,gd,trn:array [0..15] of byte;
fd:array [0..15] of char;
resl:array [1..200] of string[6];
fname:string[20];
text2:text;
i,n,kz,ks,topa1,topb1,topc1,topd1,temp:byte;
procedure result(topa,topb,topc:byte;var ks:byte);
var i:byte;
begin
if (topa=0)and(topb=0)and(topc=0) then
begin
writeln('input filename for output:');
readln(fname);
assign(text2,fname); rewrite(text2);
for i:=1 to ks do
writeln(text2,resl[i]);
close(text2);
for i:=1 to ks do writeln(resl[i]);
halt(1);
end;
end;
procedure move1(var topa,topb,topc,topd,ks1:byte);
var t,i:byte;
begin
repeat
t:=0;
if ga[topa]=succ(gd[topd]) then
begin
t:=t+1; ks1:=ks1+1;
resl[ks1]:=chr(trn[ga[topa]]+ord('a')-1)+' A D';
topd:=topd+1; gd[topd]:=ga[topa]; topa:=topa-1;
end;
if gb[topb]=succ(gd[topd]) then
begin
t:=t+1; ks1:=ks1+1;
resl[ks1]:=chr(trn[gb[topb]]+ord('a')-1)+' B D';
topd:=topd+1; gd[topd]:=gb[topb]; topb:=topb-1;
end;
if gc[topc]=succ(gd[topd]) then
begin
t:=t+1; ks1:=ks1+1;
resl[ks1]:=chr(trn[gc[topc]]+ord('a')-1)+' C D';
topd:=topd+1; gd[topd]:=gc[topc]; topc:=topc-1;
end;
result(topa,topb,topc,ks1);
until t=0;
end;
procedure move2(topa,topb,topc,topd:byte;var ks:byte);
var kp,ks1:byte;
begin
kz:=kz+1;
result(topa,topb,topc,ks);
move1(topa,topb,topc,topd,ks);
for kp:=1 to 3 do
begin
case kp of
1:if(gb[topb]<gc[topc])and(topb>0) then
begin
ks1:=ks+1;
resl[ks1]:=chr(trn[gb[topb]]+ord('a')-1)+' B C';
topc:=topc+1; temp:=gb[topb];
gc[topc]:=temp; topb:=topb-1;
move2(topa,topb,topc,topd,ks1);
topb:=topb+1; gb[topb]:=temp; topc:=topc-1;
end;
2:if(ga[topa]<gc[topc])and(topa>0) then
begin
ks1:=ks+1;
resl[ks1]:=chr(trn[ga[topa]]+ord('a')-1)+' A C';
topc:=topc+1; temp:=ga[topa];
gc[topc]:=temp; topa:=topa-1;
move2(topa,topb,topc,topd,ks1);
topa:=topa+1; ga[topa]:=temp; topc:=topc-1;
end;
3:if(topa>0) then
begin
ks1:=ks+1;
resl[ks1]:=chr(trn[ga[topa]]+ord('a')-1)+' A B';
topb:=topb+1; temp:=ga[topa];
gb[topb]:=temp; topa:=topa-1;
move2(topa,topb,topc,topd,ks1);
topa:=topa+1; ga[topa]:=temp; topb:=topb-1;
end;
end;
end;
if kz=1 then
begin writeln('No solution!'); halt(1); end;
kz:=kz-1
end;
begin{main}
writeln('input disk number:');
readln(n);
writeln('input object column:(1-n char)');
for i:=1 to n do read(fd[i]);
readln;
for i:=1 to n do trn[i]:=ord(fd[i])-ord('a')+1;
for i:=1 to n do ga[trn[i]]:=i;
for i:=1 to n do write(trn[i]:2); writeln;
for i:=1 to n do write(ga[i]:2); writeln;
kz:=0; ks:=0;
topa1:=n; topb1:=0; topc1:=0; topd1:=0;
ga[0]:=0; gb[0]:=0; gc[0]:=100; gd[0]:=0;
move2(topa1,topb1,topc1,topd1,ks);
end.
圆盘问题
题目要求:从左向右依次安放 4 根细柱 A,B,C,D. 在 A 上套有 N (N≤20) 个直径相同的圆盘, 从下到上依次用连续的小写字母 a,b,c,...编号, 将这些圆盘经过B, C 单向地移入 D (即不允许从右向左移动). 圆盘可在 B,C 中暂存. 从键盘输入 N, 及前 N 个小写字母的一个排列, 它表示最后在 D 盘上形成的一个从下到上的圆盘序列。请用文本文件 ANS2.TXT 输出形成这一排列的操作过程。该文件的每一行为一个形如 "k M L" 的字母序列, 其中 k 为圆盘编号, M 为k 盘原先的柱号, L 为新柱号。或者直接在屏幕上输出"No", 表示不能生成这种排列。
例: ┃ ┃ ┃ ┃
键盘输入: ┃ ┃ ┃ ┃
3 d ━╋━ ┃ ┃ ┃
acb c ━╋━ ┃ ┃ ┃
则一个正确的输出文件 b ━╋━ ┃ ┃ ┃
可以是: a ━╋━ ┃ ┃ ┃
c A B ━━┻━━━┻━━━┻━━━┻━
b A C A B C D
a A D
b C D
c B D
不然有这个问题的C语言也可以
谢谢!!!