回答編集履歴

1

別のプログラムを追記

2020/06/12 13:58

投稿

Bull
Bull

スコア986

test CHANGED
@@ -2,9 +2,7 @@
2
2
 
3
3
  `0`が円盤なしで、`1`が一番小さな円盤です。
4
4
 
5
- プログラムとしては特段説明するほどのものでも無く、良くあるハノイの塔を再帰で解くアルゴリズムです。
5
+ プログラムとしては特段説明するほどのものでも無く、良くあるハノイの塔を再帰で解くアルゴリズムです。円盤を移動するごとに配列を更新して、表示しています。
6
-
7
- 円盤を移動するごとに配列を更新して、表示しています。
8
6
 
9
7
  表示はお好みに合わせてどうぞ。
10
8
 
@@ -153,3 +151,111 @@
153
151
  }
154
152
 
155
153
  ```
154
+
155
+ ---
156
+
157
+ 配列を一つで、円盤がどの柱にあるか管理する方法もあります。
158
+
159
+ この方がプログラムはシンプルになりますが、表示がちょっと面倒です。
160
+
161
+ ```C
162
+
163
+ #include <stdio.h>
164
+
165
+
166
+
167
+ #define N 6 //円盤の枚数(デフォルト)
168
+
169
+ #define MAX 32
170
+
171
+
172
+
173
+ char disk[MAX]; //円盤を記録
174
+
175
+
176
+
177
+ //塔の状態を表示
178
+
179
+ void Disp(int n)
180
+
181
+ {
182
+
183
+ if (n > 0) printf("%d回目\n", n);
184
+
185
+ for (int p = 'A'; p < 'C' + 1; ++p) { //柱の'A'から'C'まで
186
+
187
+ printf("%c:", p); //柱を表示
188
+
189
+ for (int j = N; j >= 0; --j) { //大きな円盤から表示
190
+
191
+ if (disk[j] == p) { //円盤がその柱にあれば
192
+
193
+ printf("%2d", j + 1); //円盤を表示
194
+
195
+ }
196
+
197
+ }
198
+
199
+ printf("\n");
200
+
201
+ }
202
+
203
+ printf("//-----\n");
204
+
205
+ }
206
+
207
+
208
+
209
+ //ハノイの塔を解く
210
+
211
+ void Hanoi(int n, char X,char Y,char Z)
212
+
213
+ {
214
+
215
+ static int k = 0;
216
+
217
+ if (n > 0) {
218
+
219
+ Hanoi(n - 1, X, Z, Y);
220
+
221
+ disk[n - 1] = Z; //移動先を記録
222
+
223
+ Disp(++k);
224
+
225
+ Hanoi(n - 1, Y, X, Z);
226
+
227
+ }
228
+
229
+ }
230
+
231
+
232
+
233
+ int main(void)
234
+
235
+ {
236
+
237
+ int n;
238
+
239
+
240
+
241
+ printf("ハノイの塔\n円盤の枚数:");
242
+
243
+ if (scanf("%d", &n) < 1) return 1;
244
+
245
+ if (n < 1 && MAX < n) n = N;
246
+
247
+
248
+
249
+ for (int i = 0; i < n; ++i) {
250
+
251
+ disk[i] = 'A'; //'A'の柱に全ての円盤がある
252
+
253
+ }
254
+
255
+ Disp(0); //初期状態を表示
256
+
257
+ Hanoi(n, 'A', 'B', 'C');
258
+
259
+ }
260
+
261
+ ```