汉诺塔VII

第一篇博文祭汉诺塔;

此道汉诺塔耗时悠久,浪费了很多时间。最后还是请教同学才过的,所以第一道题当然要祭奠下它了;

题解:

汉诺塔中第n个盘子有可能存在初始柱start,和目标柱target,就是不可能存在中间转移n-1盘子的中间柱forbit。嗯,分析两种可能,1.如果n在初始柱,那么要将n-1盘放到中间柱,则n的初始柱start就是n-1的初始柱start,而n的中间柱forbit就是n-1的目标柱target,n的目标柱就是n-1的中间柱forbit。2.如果n在目标柱,则说明n-1已经到达前个目标柱,n-1的初始柱为n-1已到达的目标柱(暨n的中间柱),则n的目标柱target为n-1的目标柱target,而n的中间柱forbit,为n-1的初始柱start,n的初始柱start,为n-1的中间柱forbit。

代码如下:

#include<stdio.h>

int a[70];

int f1(int n,int start,int target,intforbit)

{ int i,k,j;

  if(n>0)

   {

       if(a[n]==forbit)

          return 0;

  else if(a[n]==start)

  {  j=f1(n-1,start,forbit,target);

     if(j)

                return 1;

         else return 0;

   }

  else

  {  j=f1(n-1,forbit,target,start);

     if(j)

                return 1;

         else return 0;

   }

   }

  else return 1;

}

int main()

{ int i,k,j,l,c,b;

  int m,n;

  scanf("%d",&m);

  for(i=0;i<m;i++)

   {scanf("%d",&n);

    for(k=0;k<3;k++)

        { scanf("%d",&b);

          for(j=0;j<b;j++)

          { scanf("%d",&c);

             a[c]=k;

          }

        }

  l=f1(n,0,2,1);

  if(l)

          printf("true\n");

  else printf("false\n");

   }

  return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值