emu8086 で asm x86 コードを作成する際に、隣接行列とノード数が与えられたグラフ (cicles なし) のトポロジカル ソートを見つける際に大きな問題があります。私はいくつかのアイデアを試しましたが、何もうまくいきませんでした...だから、これを解決する方法、またはこの問題にアプローチする方法について、(言葉またはコードで)助けてくれる人がいれば、それは素晴らしいことですどうすればいいのかわからないので...データは次のように与えられます。
JMP main
size db 4
graph db 0 ,1 ,1 ,0 ,0 ,0 ,0 ,1 ,0 ,0 ,0 ,1 ,0 ,0 ,0 ,0
ordering db 0 ,0 ,0 ,0
main :
これを解決するには、DFS アルゴリズムが最適だと思います。しかし、繰り返しますが、私は心からすべてを試しましたが、これまでのところ何もうまくいきませんでした...だから、どんな助けにも感謝します. 前もって感謝します!!!(そして悪い英語でごめんなさい)
編集:これを書きましたが、まったく機能しません:
JMP main
size db 4
graph db 0 ,1 ,1 ,0 ,0 ,0 ,0 ,1 ,0 ,0 ,0 ,1 ,0 ,0 ,0 ,0
ordering db 0 ,0 ,0 ,0
permanente db 0, 0, 0, 0
main :
MOV CL,1
PUSH CX
LEA BX,graph
PUSH BX
CALL visitar
RET
visitar:
PUSH BP
MOV BP,SP
MOV BX,[BP+4]
MOV CX,[BP+6]
LEA DI,size
MOV DX,[DI]
MOV SI,0
for:
CMP SI,DX
JE end_for
CMP [BX+SI],1
JE nodo
JMP next
nodo:
MOV CX,SI
ADD CX,1
PUSH CX
MOV AX,SI
MUL size
LEA BX,graph
ADD BX,AX
PUSH BX
CALL visitar
next:
ADD SI,1
JMP for
end_for:
LEA DI,permanente
ADD DI,CX
SUB DI,1
MOV [DI],1
MOV SI,DX
LEA DX,ordering
bajar:
SUB SI,1
CMP [DX+SI],0
JE cambiar
CMP SI,0
JG bajar
cambiar:
MOV [DX+SI],CX
CMP SI,0
JE return
JMP revisar
revisar:
LEA AX,permanente
MOV SI,0
sumar:
CMP [AX+SI],0
JE seguir
ADD SI,1
LEA DI,size
MOV DX,[DI]
CMP SI,DX
JE return
JMP sumar
seguir:
JMP nodo
return:
POP BP
RET 4