source: EcnlProtoTool/trunk/tcc-0.9.27/tests/tests2/30_hanoi.c@ 331

Last change on this file since 331 was 331, checked in by coas-nagasima, 6 years ago

prototoolに関連するプロジェクトをnewlibからmuslを使うよう変更・更新
ntshellをnewlibの下位の実装から、muslのsyscallの実装に変更・更新
以下のOSSをアップデート
・mruby-1.3.0
・musl-1.1.18
・onigmo-6.1.3
・tcc-0.9.27
以下のOSSを追加
・openssl-1.1.0e
・curl-7.57.0
・zlib-1.2.11
以下のmrbgemsを追加
・iij/mruby-digest
・iij/mruby-env
・iij/mruby-errno
・iij/mruby-iijson
・iij/mruby-ipaddr
・iij/mruby-mock
・iij/mruby-require
・iij/mruby-tls-openssl

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc
File size: 3.3 KB
Line 
1/* example from http://barnyard.syr.edu/quickies/hanoi.c */
2
3/* hanoi.c: solves the tower of hanoi problem. (Programming exercise.) */
4/* By Terry R. McConnell (12/2/97) */
5/* Compile: cc -o hanoi hanoi.c */
6
7/* This program does no error checking. But then, if it's right,
8 it's right ... right ? */
9
10
11/* The original towers of hanoi problem seems to have been originally posed
12 by one M. Claus in 1883. There is a popular legend that goes along with
13 it that has been often repeated and paraphrased. It goes something like this:
14 In the great temple at Benares there are 3 golden spikes. On one of them,
15 God placed 64 disks increasing in size from bottom to top, at the beginning
16 of time. Since then, and to this day, the priest on duty constantly transfers
17 disks, one at a time, in such a way that no larger disk is ever put on top
18 of a smaller one. When the disks have been transferred entirely to another
19 spike the Universe will come to an end in a large thunderclap.
20
21 This paraphrases the original legend due to DeParville, La Nature, Paris 1884,
22 Part I, 285-286. For this and further information see: Mathematical
23 Recreations & Essays, W.W. Rouse Ball, MacMillan, NewYork, 11th Ed. 1967,
24 303-305.
25 *
26 *
27 */
28
29#include <stdio.h>
30#include <stdlib.h>
31
32#define TRUE 1
33#define FALSE 0
34
35/* This is the number of "disks" on tower A initially. Taken to be 64 in the
36 * legend. The number of moves required, in general, is 2^N - 1. For N = 64,
37 * this is 18,446,744,073,709,551,615 */
38#define N 4
39
40/* These are the three towers. For example if the state of A is 0,1,3,4, that
41 * means that there are three discs on A of sizes 1, 3, and 4. (Think of right
42 * as being the "down" direction.) */
43int A[N], B[N], C[N];
44
45void Hanoi(int,int*,int*,int*);
46
47/* Print the current configuration of A, B, and C to the screen */
48void PrintAll()
49{
50 int i;
51
52 printf("A: ");
53 for(i=0;i<N;i++)printf(" %d ",A[i]);
54 printf("\n");
55
56 printf("B: ");
57 for(i=0;i<N;i++)printf(" %d ",B[i]);
58 printf("\n");
59
60 printf("C: ");
61 for(i=0;i<N;i++)printf(" %d ",C[i]);
62 printf("\n");
63 printf("------------------------------------------\n");
64 return;
65}
66
67/* Move the leftmost nonzero element of source to dest, leave behind 0. */
68/* Returns the value moved (not used.) */
69int Move(int *source, int *dest)
70{
71 int i = 0, j = 0;
72
73 while (i<N && (source[i])==0) i++;
74 while (j<N && (dest[j])==0) j++;
75
76 dest[j-1] = source[i];
77 source[i] = 0;
78 PrintAll(); /* Print configuration after each move. */
79 return dest[j-1];
80}
81
82
83/* Moves first n nonzero numbers from source to dest using the rules of Hanoi.
84 Calls itself recursively.
85 */
86void Hanoi(int n,int *source, int *dest, int *spare)
87{
88 int i;
89 if(n==1){
90 Move(source,dest);
91 return;
92 }
93
94 Hanoi(n-1,source,spare,dest);
95 Move(source,dest);
96 Hanoi(n-1,spare,dest,source);
97 return;
98}
99
100int main()
101{
102 int i;
103
104 /* initialize the towers */
105 for(i=0;i<N;i++)A[i]=i+1;
106 for(i=0;i<N;i++)B[i]=0;
107 for(i=0;i<N;i++)C[i]=0;
108
109 printf("Solution of Tower of Hanoi Problem with %d Disks\n\n",N);
110
111 /* Print the starting state */
112 printf("Starting state:\n");
113 PrintAll();
114 printf("\n\nSubsequent states:\n\n");
115
116 /* Do it! Use A = Source, B = Destination, C = Spare */
117 Hanoi(N,A,B,C);
118
119 return 0;
120}
121
122/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/
Note: See TracBrowser for help on using the repository browser.