zoukankan      html  css  js  c++  java
  • 7-17 汉诺塔的非递归实现(25 分)(有待改进)

    解题思路:1.

    我们假设现在最小的圆盘在a柱子上,柱子为a,b,c

    第一步:将最小圆盘移动到下一个柱子上,也就是b

    第二步:对a柱子和c柱子进行顶上最小的元素进行判断,把小一点的那个圆盘移动到大一点的那个圆盘(有空则摞在空柱子上)。

    重复上述两步就可以得到答案。

    注意:这样得到的最后的答案不一定是摞在c上,如果N是偶数将摞在b上,所以如果N是偶数我们就令第二个柱子为c,第三个柱子为b,这样就一定最后是摞在c上的。

                          2.不过这个还是没通过最后一项大N的测试,提示输出超限

      1 #include<stdio.h>
      2 #include<stdlib.h>
      3 
      4 int main()
      5 {
      6     int i;
      7     int n;
      8     int topa = -1;
      9     int topb = -1;
     10     int topc = -1;
     11     int temp;
     12     int to = 1;  //用to表示当前最小值所在的柱子,1为a,2为b
     13     int count ;
     14     scanf("%d",&n);
     15     int a[n];
     16     int b[n];
     17     int c[n];
     18 
     19     count = 0;  //如果n是偶数,那运行完成后C柱上有n个元素,奇数的话B柱上有n个元素
     20 
     21     for( i=n; i>0; i--)
     22     {
     23         a[++topa] = i;   //初始化低层数值大
     24 
     25     }
     26     while( 1 )
     27     {
     28         if( n%2==0)
     29         {
     30             //这里主要处理n为偶数第一步放在b上
     31             if( to==1)
     32             {
     33                 //当前最小值在a上,往前移一步
     34                 temp = a[topa--];
     35                 b[++topb] = temp;
     36                 to = 2;
     37                 printf("a -> b
    ");
     38                 if( a[topa]<c[topc] || c[topc]==0)
     39                 {
     40                     //如果a的最小值<c的最小值或者c为空,则将a的最小值移到c
     41                     temp = a[topa--];
     42                     c[++topc] = temp;
     43                     printf("a -> c
    ");
     44                     count++;
     45                     if(count==n)
     46                     {
     47                         break;
     48                     }
     49                 }
     50                 else
     51                 {
     52                     //否则将c的最小值移动到a
     53                     temp = c[topc--];
     54                     a[++topa] = temp;
     55                     printf("c -> a
    ");
     56                     count--;
     57                 }
     58 
     59             }
     60             else if( to==2)
     61             {
     62                 temp = b[topb--];
     63                 c[++topc] = temp;
     64                 to = 3;
     65                 printf("b -> c
    ");
     66                 count++;
     67                 if(count==n)
     68                 {
     69                     break;
     70                 }
     71                 if( a[topa]<b[topc] || b[topb]==0)
     72                 {
     73                     temp = a[topa--];
     74                     b[++topb] = temp;
     75                     printf("a -> b
    ");
     76                 }
     77                 else
     78                 {
     79                     temp = b[topb--];
     80                     a[++topa] = temp;
     81                     printf("b -> a
    ");
     82                 }
     83 
     84             }
     85             else if( to==3)
     86             {
     87                 temp = c[topc--];
     88                 a[++topa] = temp;
     89                 to = 1;
     90                 printf("c -> a
    ");
     91                 count--;
     92                 if( b[topa]<c[topc] || c[topc]==0)
     93                 {
     94                     temp = b[topb--];
     95                     c[++topc] = temp;
     96                     printf("b -> c
    ");
     97                     count++;
     98                     if(count==n)
     99                     {
    100                         break;
    101                     }
    102                 }
    103                 else
    104                 {
    105                     temp = c[topc--];
    106                     b[++topb] = temp;
    107                     printf("c -> b
    ");
    108                     count--;
    109                 }
    110 
    111             }
    112         }
    113 
    114         else
    115         {
    116             //这里主要处理n为奇数第一步放在c上
    117             if( to==1)
    118             {
    119                 temp = a[topa--];
    120                 b[++topb] = temp;
    121                 to = 2;
    122                 printf("a -> c
    ");
    123                 count++;
    124                 if(count==n)
    125                 {
    126                     break;
    127                 }
    128                 if( a[topa]<c[topc] || c[topc]==0)
    129                 {
    130                     temp = a[topa--];
    131                     c[++topc] = temp;
    132                     printf("a -> b
    ");
    133 
    134                 }
    135                 else
    136                 {
    137                     temp = c[topc--];
    138                     a[++topa] = temp;
    139                     printf("b -> a
    ");
    140                 }
    141 
    142             }
    143             else if( to==2)
    144             {
    145                 temp = b[topb--];
    146                 c[++topc] = temp;
    147                 to = 3;
    148                 printf("c -> b
    ");
    149                 count--;
    150                 if( a[topa]<b[topc] || b[topb]==0)
    151                 {
    152                     temp = a[topa--];
    153                     b[++topb] = temp;
    154                     printf("a -> c
    ");
    155                     count++;
    156                     if(count==n)
    157                     {
    158                         break;
    159                     }
    160                 }
    161                 else
    162                 {
    163                     temp = b[topb--];
    164                     a[++topa] = temp;
    165                     printf("c -> a
    ");
    166                     count--;
    167                 }
    168 
    169             }
    170             else if( to==3)
    171             {
    172                 temp = c[topc--];
    173                 a[++topa] = temp;
    174                 to = 1;
    175                 printf("b -> a
    ");
    176                 if( b[topa]<c[topc] || c[topc]==0)
    177                 {
    178                     temp = b[topb--];
    179                     c[++topc] = temp;
    180                     printf("c -> b
    ");
    181                     count--;
    182                 }
    183                 else
    184                 {
    185                     temp = c[topc--];
    186                     b[++topb] = temp;
    187                     printf("b -> c
    ");
    188                     count++;
    189                     if(count==n)
    190                     {
    191                         break;
    192                     }
    193                 }
    194 
    195             }
    196 
    197         }
    198     }
    199     return 0;
    200 
    201 }

    代码有点又臭又长,还没有完全通过测试盼路过的大神指导!!

    在这个国度中,必须不停地奔跑,才能使你保持在原地。如果想要寻求突破,就要以两倍现在速度奔跑!
  • 相关阅读:
    leetcode122
    leetcode121
    leetcode773
    leetcode803
    leetcode658
    leetcode723
    leetcode134
    leetcode340
    leetcode721
    leetcode362
  • 原文地址:https://www.cnblogs.com/yuxiaoba/p/8366141.html
Copyright © 2011-2022 走看看