Towers of Hanoi Puzzle (iterative)
This program solves the Towers of Hanoi puzzle with five disks. It is an adaptation of Miroslav Kolar's algorithm no. 1 for COBOL-74. It has been tested on CIS COBOL 4.2.
IDENTIFICATION DIVISION. PROGRAM-ID. ITERATIVE-TOWERS-OF-HANOI. AUTHOR. SOREN ROUG. DATE-WRITTEN. 2019-09-13. * Kolar's Hanoi Tower algorithm no. 1 * http://hanoitower.mkolar.org/algo.html * Works for up to 8 disks. ENVIRONMENT DIVISION. CONFIGURATION SECTION. SOURCE-COMPUTER. CIS-COBOL. OBJECT-COMPUTER. CP-M. INPUT-OUTPUT SECTION. FILE-CONTROL. DATA DIVISION. WORKING-STORAGE SECTION. 77 NUM-DISKS PIC 9 VALUE 5. 77 N1 PIC 9 COMP. 77 N2 PIC 9 COMP. 77 FROM-POLE PIC 9 COMP. 77 TO-POLE PIC 9 COMP. 77 VIA-POLE PIC 9 COMP. 77 FP-TMP PIC 9 COMP. 77 TO-TMP PIC 9 COMP. 77 P-TMP PIC 9 COMP. 77 TMP-P PIC 9 COMP. 77 I PIC 9 COMP. 77 DIV PIC 9 COMP. 01 STACKNUMS. 05 NUMSET OCCURS 3 TIMES. 10 DNUM PIC 9 COMP. 01 GAMESET. 05 POLES OCCURS 3 TIMES. 10 STACK OCCURS 10 TIMES. 15 POLE PIC 9 USAGE COMP. PROCEDURE DIVISION. HANOI. DISPLAY "TOWERS OF HANOI PUZZLE WITH ", NUM-DISKS, " DISKS.". ADD NUM-DISKS, 1 GIVING N1. ADD NUM-DISKS, 2 GIVING N2. MOVE 1 TO DNUM (1). MOVE N1 TO DNUM (2), DNUM (3). MOVE N1 TO POLE (1, N1), POLE (2, N1), POLE (3, N1). MOVE 1 TO POLE (1, N2). MOVE 2 TO POLE (2, N2). MOVE 3 TO POLE (3, N2). MOVE 1 TO I. PERFORM INIT-PUZZLE UNTIL I = N1. MOVE 1 TO FROM-POLE. DIVIDE 2 INTO NUM-DISKS GIVING DIV. MULTIPLY 2 BY DIV. IF DIV NOT = NUM-DISKS MOVE 3 TO TO-POLE MOVE 2 TO VIA-POLE ELSE MOVE 2 TO TO-POLE MOVE 3 TO VIA-POLE. PERFORM MOVE-DISK UNTIL DNUM (3) NOT > 1. DISPLAY "TOWERS OF HANOI PUZZLE COMPLETED!". STOP RUN. INIT-PUZZLE. MOVE I TO POLE (1, I). MOVE 0 TO POLE (2, I), POLE (3, I). ADD 1 TO I. MOVE-DISK. MOVE DNUM (FROM-POLE) TO FP-TMP. MOVE POLE (FROM-POLE, FP-TMP) TO I. DISPLAY "MOVE DISK FROM ", POLE (FROM-POLE, N2), " TO ", POLE (TO-POLE, N2). ADD 1 TO DNUM (FROM-POLE). MOVE VIA-POLE TO TMP-P. SUBTRACT 1 FROM DNUM (TO-POLE). MOVE DNUM (TO-POLE) TO TO-TMP. MOVE I TO POLE (TO-POLE, TO-TMP). DIVIDE 2 INTO I GIVING DIV. MULTIPLY 2 BY DIV. IF I NOT = DIV PERFORM MOVE-TO-VIA ELSE MOVE FROM-POLE TO VIA-POLE MOVE TMP-P TO FROM-POLE. MOVE-TO-VIA. MOVE TO-POLE TO VIA-POLE MOVE DNUM (FROM-POLE) TO FP-TMP MOVE DNUM (TMP-P) TO P-TMP IF POLE (FROM-POLE, FP-TMP) > POLE (TMP-P, P-TMP) MOVE FROM-POLE TO TO-POLE MOVE TMP-P TO FROM-POLE MOVE DNUM (FROM-POLE) TO FP-TMP MOVE DNUM (TMP-P) TO P-TMP ELSE MOVE TMP-P TO TO-POLE.
Output
TOWERS OF HANOI PUZZLE WITH 5 DISKS. MOVE DISK FROM 1 TO 3 MOVE DISK FROM 1 TO 2 MOVE DISK FROM 3 TO 2 MOVE DISK FROM 1 TO 3 MOVE DISK FROM 2 TO 1 MOVE DISK FROM 2 TO 3 MOVE DISK FROM 1 TO 3 MOVE DISK FROM 1 TO 2 MOVE DISK FROM 3 TO 2 MOVE DISK FROM 3 TO 1 MOVE DISK FROM 2 TO 1 MOVE DISK FROM 3 TO 2 MOVE DISK FROM 1 TO 3 MOVE DISK FROM 1 TO 2 MOVE DISK FROM 3 TO 2 MOVE DISK FROM 1 TO 3 MOVE DISK FROM 2 TO 1 MOVE DISK FROM 2 TO 3 MOVE DISK FROM 1 TO 3 MOVE DISK FROM 2 TO 1 MOVE DISK FROM 3 TO 2 MOVE DISK FROM 3 TO 1 MOVE DISK FROM 2 TO 1 MOVE DISK FROM 2 TO 3 MOVE DISK FROM 1 TO 3 MOVE DISK FROM 1 TO 2 MOVE DISK FROM 3 TO 2 MOVE DISK FROM 1 TO 3 MOVE DISK FROM 2 TO 1 MOVE DISK FROM 2 TO 3 MOVE DISK FROM 1 TO 3 TOWERS OF HANOI PUZZLE COMPLETED!