/* * tower of Hanoi program * user enters number of disks to be moved * program loops until EOF * * Matt Bishop, ECS 36A, Fall 2019 */ #include #include /* * macros */ #define MAXINPUT 100 /* maximum length of input */ /* * the recursive tower of Hanoi solution * move ndisks from fromtower to totower * temptower is a tower used to hold disks temporarily * * returns the number of moves made */ int tower(int ndisks, char fromtower, char totower, char temptower) { int n; /* nu,ber of disks moved */ /* base case: move 1 disk */ if (ndisks == 1){ printf("Move top disk from tower %c to tower %c\n", fromtower, totower); return(1); } /* now recurse -- move n-1 disks to the temptower 1 to the */ /* totower, then n-1 from the temptower to the totower */ n = tower(ndisks-1, fromtower, temptower, totower); n += tower(1, fromtower, totower, temptower); n += tower(ndisks-1, temptower, totower, fromtower); /* return the number of disks moved */ return(n); } /* * the main routine */ int main(void) { int n; /* number of disks to move */ int nmoves; /* number of moves */ char buf[MAXINPUT]; /* input buffer */ /* prompt for the number of disks */ printf("Number of disks on A (EOF to exit): "); /* * now loop until the user wants to bail */ while(fgets(buf, MAXINPUT, stdin) != NULL){ /* check for the string "EOF\n" (smartypants!) */ if (strcmp(buf, "EOF\n") == 0) return(0); /* convert this to an integer, reporting an error if needed */ if (sscanf(buf, "%d", &n) != 1 || n <= 0){ fprintf(stderr, "Enter a positive integer\n"); } else{ /* move those disks */ nmoves = tower(n, 'A', 'C', 'B'); /* announce the results -- note proper grammar */ printf("*** Moving %d disks from A to C takes %d ", n, nmoves); if (nmoves == 1) printf("move\n"); else printf("moves\n"); } /* prompt for the number of disks */ printf("Number of disks on A (EOF to exit): "); } /* EOF doesn't terminate line, so do that and exit */ putchar('\n'); return(0); }