2025年08月03日
帐号 密码


图的深度优先搜索【源代码】

文章作者:三把刀

assume cs:code

code segment
                
                DFSV    db 16    dup(0)
                
                NODEV db "abcde"
                
                NODE    db 0,0, 0,0, 0,0, 0,0, 0,0
                
                NODES    dw NODE1,NODE2,NODE3,NODE4,NODE5
                
                NODE1    dw 0, 1, 0, 1, 0
                NODE2    dw 1, 0, 1, 0, 1
                NODE3    dw 0, 1, 0, 1, 1
                NODE4    dw 1, 0, 1, 0, 0
                NODE5    dw 0, 1, 1, 0, 0
                
start:
                ;图有五个节点
                
                mov ax,cs
                mov ds,ax
                
                call ShowNodeRelation
                
                call DFSearch
                
                mov ax,4c00h
               int 21h
               
               
;-----------------------------------DFSearch start
                ;深度优先搜索
                
DFSearch:
                
                push si
                push di
                push ax
                push dx
                push cx
                push bx
                
                mov si,0
                mov di,0
                mov dl,3
                mov byte ptr NODE[di],1
                mov byte ptr NODE[di + 1],-1
                
                ;打印
                push bx
                push di
                mov ax,di
                mov bl,2
                div bl
                mov di,ax
                
                mov dh,10
                inc dl
                mov bl,1
                mov bh,NODEV[di]
                mov cl,00000001B
                call print
                
                pop di
                pop bx
                
DFSS:
                call DFSF1
                cmp byte ptr DFSV[0],-1
                je DFSS1
                
                mov ax,0
                mov al,DFSV[0]
                mov si,ax
                
                mov ax,di
                mov NODE[si + 1],al
                mov di,si
                
                ;打印
                push bx
                push di
                mov ax,di
                mov bl,2
                div bl
                mov di,ax
                
                mov dh,10
                inc dl
                mov cl,00000001B
                call ShowArrow
                add dl,4
                
                mov bl,1
                mov bh,NODEV[di]
                call print
                
                pop di
                pop bx
                
                jmp DFSS
                
DFSS1:
                cmp byte ptr NODE[di + 1],-1
                je DFSearchReturn
                
                mov ax,0
                mov al,NODE[di + 1]
                mov si,ax
                mov di,si
                
                ;打印
                push bx
                push di
                mov ax,di
                mov bl,2
                div bl
                mov di,ax
                
                mov dh,10
                inc dl
                mov cl,00000001B
                call ShowArrow
                add dl,4
                
                mov bl,1
                mov bh,NODEV[di]
                call print
                
                pop di
                pop bx
                
                jmp DFSS
                
DFSearchReturn:
                
                pop bx
                pop cx
                pop dx
                pop ax
                pop di
                pop si
                ret
                
;--------function1 start

                ;指定节点是否有未访问的邻近节点
DFSF1:
                push si
                push di
                push ax
                
                mov si,NODES[si]
                mov di,0
                
DFSF1S:

                cmp di,10
                je DFSF1ReturnB
                
                cmp byte ptr cs:[si],0
                je DFSF1S1
                
                cmp byte ptr NODE[di],0
                je DFSF1ReturnA
                
                add si,2
                add di,2
                
                jmp DFSF1S
                
DFSF1S1:
                add si,2
                add di,2
                jmp DFSF1S
                
DFSF1ReturnA:
                mov word ptr NODE[di],1
                mov ax,di
                mov DFSV[0],al
                jmp DFSF1Return

DFSF1ReturnB:
                mov byte ptr DFSV[0],-1

DFSF1Return:
                
                pop ax
                pop di
                pop si
                ret
                
;--------function1 end
                
;-----------------------------------DFSearch end

;-----------------------------------print start
                ;打印字符
                ;可以打印单个字符和数据段中的数据
                ;cl颜色值
                ;dh,dl传行列
                ;bl传功能号
                ;0ds:si传数据段的位置
                ;1bh传打印的数据
                
print:  
                push ax
                push di
                push es
                push dx
                push bx
                push si
                
                mov ax,0b800h
                mov es,ax
                mov ax,0
                mov al,160
                mul dh
                mov di,ax
                mov ax,2
                mul dl
                add di,ax
                
                
                cmp bl,0
                je show0
                cmp bl,1
                je show1
                jmp return
                
show0:    
                mov al,[si]
                mov es:[di],al
                mov es:[di + 1],cl
                inc si
                cmp byte ptr [si],'#'
                je return
                add di,2
                jmp show0
                
show1:  
                
                mov es:[di],bh
                mov es:[di + 1],cl
                
return: 
                
                pop si
                pop bx
                pop dx
                pop es
                pop di
                pop ax
                ret
                
;-----------------------------------print end

;-----------------------------------ShowArrow start

ShowArrow:
                
                jmp ShowArrowStart
                
                SACUE db "-->#"
                
ShowArrowStart:
                
                push ax
                push bx
                push ds
                push si
                
                mov ax,cs
                mov ds,ax
                mov si,offset SACUE
                mov bl,0
                call print
                
                pop si
                pop ds
                pop bx
                pop ax
                ret
                
;-----------------------------------ShowArrow end

;-----------------------------------ShowNodeRelation start
                ;显示节点间的关系
ShowNodeRelation:
                push di
                push si
                push cx
                push dx
                push ax
                push bp
                
                call ClearScreen
                
                mov di,0
                mov dl,0
                
                mov cx,5
SNRS:
                push cx
                
                mov si,0
                mov al,dl
                mov dh,5
                mov bp,NODES[di]
                
                ;打印
                push dx
                push cx
                push bx
                push ax
                
                mov dh,4
                mov cl,00000001B
                mov ax,di
                mov bl,2
                div bl
                mov bl,al
                call ShowCue
                
                pop ax
                pop bx
                pop cx
                pop dx
                
                mov cx,5
SNRS1:
                
                cmp word ptr [bp + si],0
                je SNRS2
                
                push cx
                push di
                push si
                push ax
                mov cl,00000001B
                
                mov ax,di
                mov bl,2
                div bl
                mov di,ax
                mov bl,1
                mov bh,NODEV[di]
                call print
                
                inc dl
                call ShowArrow
                add dl,4
                
                mov ax,si
                mov bl,2
                div bl
                mov si,ax
                mov bl,1
                mov bh,NODEV[si]
                call print
                pop ax
                pop si
                pop di
                pop cx
                
                inc dh
                
                mov dl,al
                
SNRS2:
                add si,2
                loop SNRS1
                
                add dl,10
                add di,2
                pop cx
                loop SNRS
                
                pop bp
                pop ax
                pop dx
                pop cx
                pop si
                pop di
                ret
                
;-----------------------------------ShowNodeRelation end

;-----------------------------------ShowCue start
                
                ;显示提示
                ;bl传打印那个提示
                
ShowCue:
                
                jmp ShowCueStart
                
                CUES dw CUE0,CUE1,CUE2,CUE3,CUE4
                
                CUE0 db "node a:#"
                
                CUE1 db "node b:#"
                
                CUE2 db "node c:#"
                
                CUE3 db "node d:#"
                
                CUE4 db "node e:#"
                
ShowCueStart:
                
                push ax
                push bx
                push si
                push ds
                
                mov al,2
                mul bl
                mov bx,ax
                
                mov ax,cs
                mov ds,ax
                mov si,CUES[bx]
                mov bl,0
                call print
                
ShowCueReturn:
                
                pop ds
                pop si
                pop bx
                pop ax
                ret

;-----------------------------------ShowCur end

;--------------------------------ClearScreen start
                
                ;清屏
ClearScreen:
                
                push bx
                push es
                push cx
                
        mov bx,0b800h
        mov es,bx
        mov bx,0
        mov cx,2000
        
CLS:
        
        mov byte ptr es:[bx],' '
        add bx,2
        loop CLS
             
             pop cx
             pop es
             pop bx
             ret
             
;--------------------------------ClearScreen end

code ends
end start

发表日期:09/09/21 00:00

网友评论(0)

当前1/1页 首页 上一页下一页 尾页

我也跟评:

     验证码 验证码... [看不清]