现在的位置: 首页 > 综合 > 正文

poj1920

2018年01月15日 ⁄ 综合 ⁄ 共 744字 ⁄ 字号 评论关闭

【题意】

给定一个汉诺塔的局面,问最少多少步可以将它们并到一个柱子上

【输入】

第一行n,表示n个盘子

接下来一行3个数字m[i],表示柱子上分别有几个盘子

随后的三行每行m[i]个数字,表示在该柱子上的盘子的编号

【输出】

第一行输出一个数字表示集中到哪个柱子上

第二行输出一个数字表示最小步数模1000000

汉诺塔的过程是可逆的,所以反过来考虑n个盘子都在一根柱子上最少需要移动多少步才能到达当前局面

既然倒过来了,那最底层的盘子就不要动了,所以最初的n个的盘子堆在n所在的柱子

然后从盘子编号从大到小考虑,假设当前i不在要到达局面的柱子上,那么就要将它所有上面的盘子移动到与它无关的柱子上,然后再将盘子i移到指定位置

program poj1920;
const
  maxn=1000000;
var
  ans,n,i,j,k,now:longint;
  two:array [0..100001] of longint;
  m:array [1..3] of longint;
  belong:array [0..100001] of longint;

begin
  two[0]:=1;
  for i:=1 to 100000 do
    two[i]:=two[i-1]*2 mod maxn;
  read(n);
  for i:=1 to 3 do
    read(m[i]);
  for i:=1 to 3 do
    for j:=1 to m[i] do
      begin
        read(k);
        belong[k]:=i;
      end;
  writeln(belong[n]);
  ans:=0;
  now:=belong[n];
  for i:=n downto 1 do
    if now<>belong[i] then
      begin
        ans:=(ans+two[i-1]) mod maxn;
        now:=6-belong[i]-now;
      end;
  writeln(ans);
end.
【上篇】
【下篇】

抱歉!评论已关闭.