题目描述
设有n个大小不等的中空圆盘,按从小到大的顺序从1到n编号。将这n个圆盘任意的迭套在三根立柱上,立柱的编号分别为A、B、C,这个状态称为初始状态。
现在要求找到一种步数最少的移动方案,使得从初始状态转变为目标状态。
移动时有如下要求:
·一次只能移一个盘;
·不允许把大盘移到小盘上面。
输入输出格式
输入格式:
文件第一行是状态中圆盘总数;
第二到第四行分别是初始状态中A、B、C柱上圆盘的个数和从上到下每个圆盘的编号;
第五到第七行分别是目标状态中A、B、C柱上圆盘的个数和从上到下每个圆盘的编号。
输出格式:
每行一步移动方案,格式为:move I from P to Q
最后一行输出最少的步数。
输入输出样例
输入样例#1:
5
3 3 2 1
2 5 4
0
1 2
3 5 4 3
1 1
输出样例#1:
move 1 from A to B
move 2 from A to C
move 1 from B to C
move 3 from A to B
move 1 from C to B
move 2 from C to A
move 1 from B to C
7
做法:一道很简单的递归
代码如下:
const
c:array[1..3] of char=('A','B','C');
var
a:array[1..1000] of longint;
b:array[1..1000] of longint;
i,j,k,m,n,s,t:longint;
procedure dg(x,y:longint);
var
i,j,k,l:longint;
b:array[1..3] of longint;
begin
if a[x]=y then exit;
for i:=1 to 3 do
b[i]:=0;
b[a[x]]:=1;
b[y]:=1;
for i:=1 to 3 do
if b[i]=0 then begin j:=i; break; end;
for i:=x-1 downto 1 do
dg(i,j);
writeln('move ',x,' from ',c[a[x]],' to ',c[y]);
a[x]:=y;
s:=s+1;
end;
begin
readln(n);
for i:=1 to 3 do
begin
read(s);
for j:=1 to s do
begin
read(k);
a[k]:=i;
end;
end;
for i:=1 to 3 do
begin
read(s);
for j:=1 to s do
begin
read(k);
b[k]:=i;
end;
end;
s:=0;
for i:=n downto 1 do
dg(i,b[i]);
writeln(s);
end.