|
UMBC CMSC 201 Fall '05 CSEE | 201 | 201 F'05 | lectures | news | help |
The Tower of Hanoi
is a puzzle consisting of three pegs, and a number of discs of different
sizes which can slot onto any peg. 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 %