7-17 汉诺塔的非递归实现(25 分)(有待改进)

Posted yuxiaoba

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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\n");
 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\n");
 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\n");
 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\n");
 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\n");
 76                 }
 77                 else
 78                 {
 79                     temp = b[topb--];
 80                     a[++topa] = temp;
 81                     printf("b -> a\n");
 82                 }
 83 
 84             }
 85             else if( to==3)
 86             {
 87                 temp = c[topc--];
 88                 a[++topa] = temp;
 89                 to = 1;
 90                 printf("c -> a\n");
 91                 count--;
 92                 if( b[topa]<c[topc] || c[topc]==0)
 93                 {
 94                     temp = b[topb--];
 95                     c[++topc] = temp;
 96                     printf("b -> c\n");
 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\n");
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\n");
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\n");
133 
134                 }
135                 else
136                 {
137                     temp = c[topc--];
138                     a[++topa] = temp;
139                     printf("b -> a\n");
140                 }
141 
142             }
143             else if( to==2)
144             {
145                 temp = b[topb--];
146                 c[++topc] = temp;
147                 to = 3;
148                 printf("c -> b\n");
149                 count--;
150                 if( a[topa]<b[topc] || b[topb]==0)
151                 {
152                     temp = a[topa--];
153                     b[++topb] = temp;
154                     printf("a -> c\n");
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\n");
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\n");
176                 if( b[topa]<c[topc] || c[topc]==0)
177                 {
178                     temp = b[topb--];
179                     c[++topc] = temp;
180                     printf("c -> b\n");
181                     count--;
182                 }
183                 else
184                 {
185                     temp = c[topc--];
186                     b[++topb] = temp;
187                     printf("b -> c\n");
188                     count++;
189                     if(count==n)
190                     {
191                         break;
192                     }
193                 }
194 
195             }
196 
197         }
198     }
199     return 0;
200 
201 }

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

以上是关于7-17 汉诺塔的非递归实现(25 分)(有待改进)的主要内容,如果未能解决你的问题,请参考以下文章

7-17 汉诺塔的非递归实现

5-17 汉诺塔的非递归实现 (25分)

习题3.10 汉诺塔的非递归实现(25 分)浙大版《数据结构(第2版)》题目集

汉诺塔的非递归实现(借助堆栈模拟递归)

汉诺塔的非递归实现(栈)

汉诺塔的非递归算法