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

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

借助堆栈以非递归(循环)方式求解汉诺塔的问题(n, a, b, c),即将N个盘子从起始柱(标记为“a”)通过借助柱(标记为“b”)移动到目标柱(标记为“c”),并保证每个移动符合汉诺塔问题的要求。

输入格式:

输入为一个正整数N,即起始柱上的盘数。

输出格式:

每个操作(移动)占一行,按柱1 -> 柱2的格式输出。

输入样例:

1
3

输出样例:

1
2
3
4
5
6
7
a -> c
a -> b
c -> b
a -> c
b -> a
b -> c
a -> c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
#include<stdio.h>
#include<stdlib.h>

int main()
{
int i;
int n;
int topa = -1;
int topb = -1;
int topc = -1;
int temp;
int to = 1; //用to表示当前最小值所在的柱子,1为a,2为b
int count ;
scanf("%d",&n);
int a[n];
int b[n];
int c[n];

count = 0; //如果n是偶数,那运行完成后C柱上有n个元素,奇数的话B柱上有n个元素

for( i=n; i>0; i--)
{
a[++topa] = i; //初始化低层数值大

}
while( 1 )
{
if( n%2==0)
{
//这里主要处理n为偶数第一步放在b上
if( to==1)
{
//当前最小值在a上,往前移一步
temp = a[topa--];
b[++topb] = temp;
to = 2;
printf("a -> b\n");
if( a[topa]<c[topc] || c[topc]==0)
{
//如果a的最小值<c的最小值或者c为空,则将a的最小值移到c
temp = a[topa--];
c[++topc] = temp;
printf("a -> c\n");
count++;
if(count==n)
{
break;
}
}
else
{
//否则将c的最小值移动到a
temp = c[topc--];
a[++topa] = temp;
printf("c -> a\n");
count--;
}

}
else if( to==2)
{
temp = b[topb--];
c[++topc] = temp;
to = 3;
printf("b -> c\n");
count++;
if(count==n)
{
break;
}
if( a[topa]<b[topc] || b[topb]==0)
{
temp = a[topa--];
b[++topb] = temp;
printf("a -> b\n");
}
else
{
temp = b[topb--];
a[++topa] = temp;
printf("b -> a\n");
}

}
else if( to==3)
{
temp = c[topc--];
a[++topa] = temp;
to = 1;
printf("c -> a\n");
count--;
if( b[topa]<c[topc] || c[topc]==0)
{
temp = b[topb--];
c[++topc] = temp;
printf("b -> c\n");
count++;
if(count==n)
{
break;
}
}
else
{
temp = c[topc--];
b[++topb] = temp;
printf("c -> b\n");
count--;
}

}
}

else
{
//这里主要处理n为奇数第一步放在c上
if( to==1)
{
temp = a[topa--];
b[++topb] = temp;
to = 2;
printf("a -> c\n");
count++;
if(count==n)
{
break;
}
if( a[topa]<c[topc] || c[topc]==0)
{
temp = a[topa--];
c[++topc] = temp;
printf("a -> b\n");

}
else
{
temp = c[topc--];
a[++topa] = temp;
printf("b -> a\n");
}

}
else if( to==2)
{
temp = b[topb--];
c[++topc] = temp;
to = 3;
printf("c -> b\n");
count--;
if( a[topa]<b[topc] || b[topb]==0)
{
temp = a[topa--];
b[++topb] = temp;
printf("a -> c\n");
count++;
if(count==n)
{
break;
}
}
else
{
temp = b[topb--];
a[++topa] = temp;
printf("c -> a\n");
count--;
}

}
else if( to==3)
{
temp = c[topc--];
a[++topa] = temp;
to = 1;
printf("b -> a\n");
if( b[topa]<c[topc] || c[topc]==0)
{
temp = b[topb--];
c[++topc] = temp;
printf("c -> b\n");
count--;
}
else
{
temp = c[topc--];
b[++topb] = temp;
printf("b -> c\n");
count++;
if(count==n)
{
break;
}
}

}

}
}
return 0;

}
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×