图示HANOI的移动过程

图示HANOI的移动过程

DATA SEGMENT             ;数据段定义
     A DW 5              ;用于标识哪一个盘在移动 SI 
	 SUM DW 4            ;总共有多少个盘   DI
	 FIRSTPLANT DB 'A'   ;第A根柱子   AX 
	 SECONDPLANT DB 'B'  ;第B根柱子   BX 
	 THIRTHPLANT DB 'C'  ;第C根柱子   CX
	 FLAG DW ?           ;保护AX内容
	 FLAG1 DW 15         ;一共移动多少次
	 FIRSTPLANT1 DW  4,1,2,3,4     ;第A根柱子上有哪几个盘 
	 SECONDPLANT1 DW 5 DUP(0)      ;第B根柱子上有哪几个盘 
	 THIRTHPLANT1 DW 5 DUP(0)      ;第C根柱子上有哪几个盘
	 STRING0 DB '          |',0DH,0AH,'$'
	 STRING1 DB '         *|*',0DH,0AH,'$'
	 STRING2 DB '        **|**',0DH,0AH,'$'
	 STRING3 DB '       ***|***',0DH,0AH,'$'
	 STRING4 DB '      ****|****',0DH,0AH,'$'
	 STRING5 DB '    =============',0DH,0AH,'$' 
	 STRING6 DB '          A',0DH,0AH,0DH,0AH,'$'
	 STRING7 DB '          B',0DH,0AH,0DH,0AH,'$'
	 STRING8 DB '          C',0DH,0AH,0DH,0AH,'$'
	 DIDAS DW 30
DATA ENDS

STACK SEGMENT stack               ;堆栈段定义
      DW 300 DUP(?)
	  TOP LABEL WORD
STACK ENDS

CODE SEGMENT                       ;代码段
   ASSUME CS:CODE,DS:DATA,SS:STACK
MAIN PROC FAR
     MOV AX,STACK                  ;堆栈段初始化
	 MOV SS,AX
	 LEA SP,TOP
	 MOV AX,DATA                   ;数据段初始化
	 MOV DS,AX
	 MOV SI,A
	 MOV DI,SUM 
	 MOV AX,0
	 MOV BX,0
	 MOV CX,0 
	 MOV BP,0
	 MOV AL,FIRSTPLANT
	 MOV BL,SECONDPLANT
	 MOV CL,THIRTHPLANT
	 PUSH DI
	 PUSH BP
	 PUSH AX
	 CALL PRINT
	 POP AX
	 POP BP
	 POP DI
  L1:CMP DI,1
	 JE L2
	 CMP BP,1
	 JE L5
	 PUSH SI
	 PUSH DI 
	 PUSH AX
	 PUSH BX
	 PUSH CX
  L3:CALL HANNUO1 
     JMP L1 
  L2:DEC SI
     CALL MOVE1 
     
     POP CX
	 POP BX
	 POP AX
	 POP DI
	 POP SI
	 MOV DX,FLAG1
	 CMP DX,0
	 JE L4
	 DEC SI
	 CALL MOVE1 
	 
	 DEC DI
	 CALL HANNUO2
	 JMP L1
  L5:MOV BP,0
     JMP L1
  L4:;MOV AH,4CH
     ;INT 21H
     RET 
MAIN ENDP

HANNUO1 PROC NEAR    
     DEC SI
	 DEC DI 
	 XCHG BX,CX
	 RET
HANNUO1 ENDP

HANNUO2 PROC NEAR
      MOV BP,1
      XCHG AX,BX
	  RET 
HANNUO2 ENDP

MOVE1 PROC NEAR      
      PUSH DI
	  PUSH BP 
      MOV FLAG,AX
	  MOV BP,0
	  MOV DX,1
	  CMP AX,'A'
	  JNE R1
	  LEA DI,FIRSTPLANT1
	  JMP R3 
   R1:CMP AX,'B'
      JNE R2
	  LEA DI,SECONDPLANT1
	  JMP R3
   R2:LEA DI,THIRTHPLANT1
   R3:SUB [DI],DX
      ADD DI,SI
      ADD DI,SI
      MOV [DI],BP 
	  CMP CX,'A'
	  JNE R4
	  LEA DI,FIRSTPLANT1
	  JMP R6 
   R4:CMP CX,'B'
      JNE R5
	  LEA DI,SECONDPLANT1
	  JMP R6
   R5:LEA DI,THIRTHPLANT1
   R6:ADD [DI],DX
      ADD DI,SI
      ADD DI,SI
      MOV [DI],SI 
	  CALL PRINT
      ;MOV DX,AX
	  ;MOV AH,2
	  ;INT 21H
	  ;MOV DL,'-'
	  ;MOV AH,2
	  ;INT 21H
	  ;MOV DX,CX
	  ;MOV AH,2
	  ;INT 21H
	  ;MOV DL,','
	  ;MOV AH,2
	  ;INT 21H
	  ;MOV DX,SI
	  ;ADD DL,30H
	  ;MOV AH,2
	  ;INT 21H 
	  ;MOV DL,0DH
	  ;MOV AH,2
	  ;INT 21H
	  ;MOV DL,0AH
	  ;MOV AH,2
	  ;INT 21H
	  MOV AX,FLAG
	  MOV DX,FLAG1
	  DEC DX
	  MOV FLAG1,DX
	  POP BP
	  POP DI 
	  RET 
MOVE1 ENDP 

PRINT PROC NEAR                  ;汉诺塔移动结果显示
      CALL CLEAR
      mov ax,0F3H
      int 10H
      LEA DI,FIRSTPLANT1
	  CALL PRINT1
	  LEA DX,STRING6
	  MOV AH,9
	  INT 21H 
	  LEA DI,SECONDPLANT1
	  CALL PRINT1
	  LEA DX,STRING7
	  MOV AH,9
	  INT 21H 
      LEA DI,THIRTHPLANT1
	  CALL PRINT1
	  LEA DX,STRING8
	  MOV AH,9
	  INT 21H 
	  CALL DELAY
      mov ax,83H
      int 10H
      RET 
PRINT ENDP

PRINT1 PROC NEAR                  ;汉诺塔移动结果显示
     MOV DX,5
     SUB DX,[DI]
	 PUSH DI
	 MOV DI,DX
	 LEA DX,STRING0
  L6:CMP DI,0
	 JE L7
	 MOV AH,9
	 INT 21H
	 DEC DI
	 JMP L6 
 L7:MOV BP,4
    POP DI
 L8:ADD DI,2
    CMP BP,0
    JE Q6 
	CMP WORD PTR [DI],0
	JE Q5 
	CMP WORD PTR [DI],1
	JNE Q1
	LEA DX,STRING1
	JMP Q4
 Q1:CMP WORD PTR [DI],2
	JNE Q2 
	LEA DX,STRING2
	JMP Q4  
 Q2:CMP WORD PTR [DI],3
	JNE Q3 
	LEA DX,STRING3
	JMP Q4 
 Q3:LEA DX,STRING4
 Q4:MOV AH,9
    INT 21H
 Q5:DEC BP
    JMP L8 
 Q6:LEA DX,STRING5
    MOV AH,9
    INT 21H
    RET
PRINT1 ENDP 

DELAY PROC NEAR                ;每一步移动结果延时输出
    PUSH DX
    PUSH CX
    XOR AX,AX
    INT 1AH
    MOV CS:TIMES,DX
    MOV CS:TIMES[2],CX
READ_TIME: XOR AX,AX
    INT 1AH
    SUB DX,CS:TIMES
    SBB CX,CS:TIMES[2]
    CMP DX,DIDAS
    JB READ_TIME
    POP CX
    POP DX
ret
Times dw 0,0
DELAY ENDP

CLEAR PROC NEAR                   ;显示每一步之后清屏
     PUSH AX
     PUSH BX
     PUSH CX
     MOV AH,6
     MOV AL,0
     MOV BH,7
     MOV CH,0
     MOV CL,0
     MOV DH,24
     MOV DL,79
     INT 10H
     MOV DX,0
     MOV AH,2
     INT 10H
     POP CX
     POP BX
     POP AX
    RET 
CLEAR ENDP
CODE ENDS
     END MAIN 

盘子移动算法

(1)以C盘为中介,从A杆将1至n-1号盘移至B杆;若判断还未将n - 1移动到B盘,则将还有多少个盘为移动、哪一个盘为移动等数据内容进栈,调用HANNUO1子程序。
(2)将A杆中剩下的第n号盘移至C杆,调用MOVE1子程序。
(3)以A杆为中介,从B杆将1至n-1号盘移至C杆。弹出栈顶存放,实现递归算法的回调。调用HANNUO2子程序,交换A、B柱子所表示的参数。及相当于第(1)步以C杆为中介,从A杆将1至n-1号盘移至B杆,则可继续调用HANNUO1子程序。

运行结果

初始状态:
在这里插入图片描述

最后状态:
在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值