UMBC CMSC 201 Fall '05 CSEE | 201 | 201 F'05 | lectures | news | help |
There is a backstory involving Zen monks and 64 golden disks, but it's invented.
Here's a simple recursive algorithm for the TOH
Preliminaries
- Label the pegs A, B and C
- Assume there are N discs properly stacked on peg A
To move n discs from peg A to peg B:
- move n-1 discs from A to C.
- move the remaining disc from A to B.
- move n-1 discs from C to B.
/*************************************************** * File: toh.c * Author: Tim Finin * Date: 4/12/2005 * Modified by: Sue Evans * Date: 11/5/05 * * A recursive solution for the Towers Of Hanoi problem * that uses command line arguments * * Usage: toh <positive integer> * where the integer is the number of disks ************************************************************/ #include <stdio.h> #include <stdlib.h> void TowersOfHanoi(int n, char from, char to, char spare); int main (int argc, char **argv) { int n; if (argc != 2) { printf("Usage: toh <positive integer>\n"); exit(-1); } n = atoi(argv[1]); printf("Moving %d discs from peg %c to peg %c:\n", n, 'A', 'B'); TowersOfHanoi(n, 'A', 'B', 'C'); return 0; } void TowersOfHanoi (int n, char from, char to, char spare) { if (n < 1) { return; } TowersOfHanoi(n-1, from, spare, to); printf(" move a disc from peg %c to peg %c\n", from, to); TowersOfHanoi(n-1, spare, to, from); }
% gcc -o toh -Wall -ansi toh.c % toh 3 Moving 3 discs from peg A to peg B: move a disc from peg A to peg B move a disc from peg A to peg C move a disc from peg B to peg C move a disc from peg A to peg B move a disc from peg C to peg A move a disc from peg C to peg B move a disc from peg A to peg B % toh 4 Moving 4 discs from peg A to peg B: move a disc from peg A to peg C move a disc from peg A to peg B move a disc from peg C to peg B move a disc from peg A to peg C move a disc from peg B to peg A move a disc from peg B to peg C move a disc from peg A to peg C move a disc from peg A to peg B move a disc from peg C to peg B move a disc from peg C to peg A move a disc from peg B to peg A move a disc from peg C to peg B move a disc from peg A to peg C move a disc from peg A to peg B move a disc from peg C to peg B % toh 5 Moving 5 discs from peg A to peg B: move a disc from peg A to peg B move a disc from peg A to peg C move a disc from peg B to peg C move a disc from peg A to peg B move a disc from peg C to peg A move a disc from peg C to peg B move a disc from peg A to peg B move a disc from peg A to peg C move a disc from peg B to peg C move a disc from peg B to peg A move a disc from peg C to peg A move a disc from peg B to peg C move a disc from peg A to peg B move a disc from peg A to peg C move a disc from peg B to peg C move a disc from peg A to peg B move a disc from peg C to peg A move a disc from peg C to peg B move a disc from peg A to peg B move a disc from peg C to peg A move a disc from peg B to peg C move a disc from peg B to peg A move a disc from peg C to peg A move a disc from peg C to peg B move a disc from peg A to peg B move a disc from peg A to peg C move a disc from peg B to peg C move a disc from peg A to peg B move a disc from peg C to peg A move a disc from peg C to peg B move a disc from peg A to peg B %