01迷宫
Posted tuoniao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了01迷宫相关的知识,希望对你有一定的参考价值。
01迷宫
使用深度优先探索算法求解01迷宫的逃离路线个数。
逃跑路线
- 左图表示的是一个4*5的01矩阵,这个矩阵就是一个01迷宫。
- 如左图,以红色0作为起点,绿色0作为终点,每一次行进只能选择上下左右中值为0且未走过的位置,满足上述条件的路线,即为一条迷宫逃跑路线。如右图中,蓝色的路线即为一条逃跑路线。
题目描述
- 使用mips实现01迷宫路线数目计算。
- 以0x00000000为数据段起始地址。
- 输入一个n*m的01矩阵作为01迷宫,并给定他的起点与终点,求出他不同逃跑路线的数目(不同逃跑路线中可以有相同的部分,但是不能完全相同)。
- 每组数据最多执行5,000,000条指令。
输入格式
前两行输入两个整数n和m(n、m均为正整数并且小于等于7),分别代表01矩阵行数和列数。接下来的n*m行,每行输入1个整数(0或1),对应着01矩阵各个元素值(第i*m+j个整数为矩阵的第(i+1)行第j个元素,即一行一行输入)。接下来的四行分别代表迷宫的起点和终点,每行一个整数,分别代表起点与终点行数和列数。
输出格式
只输出一个整数,代表逃跑路线的数目。
输入样例
4 5 0 0 1 0 0 1 0 0 0 1 1 0 1 0 1 1 0 0 0 0 1 1 4 5
输出样例
2
提交要求
- 请勿使用
.globl main
- 不考虑延迟槽
- 只需要提交.asm文件。
- 程序的初始地址设置为Compact,Data at Address 0。
题解
1 .data 2 map: .space 49 3 visit:.space 49 4 5 .text 6 li $v0,5 7 syscall 8 move $s0,$v0 #s0=n 9 li $v0,5 10 syscall 11 move $s1,$v0 #s1=m 12 13 move $t0,$zero #t0=i 14 move $t1,$zero #t1=j 15 move $t2,$zero 16 17 read: mult $t0,$s1 18 mflo $t2 19 add $t2,$t2,$t1 20 li $v0,5 21 syscall 22 sb $v0,map($t2) 23 24 addi $t1,$t1,1 25 bne $t1,$s1,read 26 27 move $t1,$zero 28 addi $t0,$t0,1 29 bne $t0,$s0,read 30 31 li $v0,5 32 syscall 33 addi $s2,$v0,-1 #s2=x1 34 li $v0,5 35 syscall 36 addi $s3,$v0,-1 #s3=y1 37 li $v0,5 38 syscall 39 addi $s4,$v0,-1 #s4=x2 40 li $v0,5 41 syscall 42 addi $s5,$v0,-1 #s5=y2 43 44 move $a0,$zero #a0=x 45 move $a1,$zero #a1=y 46 move $v0,$zero #v0=sum 47 jal dfs 48 49 move $a0,$a3 50 li $v0,1 51 syscall 52 li $v0,10 53 syscall 54 55 dfs: bne $a0,$s4,judge 56 bne $a1,$s5,judge 57 addi $a3,$a3,1 58 j return 59 60 judge:beq $a0,-1,return 61 beq $a0,$s0,return 62 beq $a1,-1,return 63 beq $a1,$s1,return 64 65 mult $a0,$s1 66 mflo $t0 67 add $t0,$t0,$a1 68 lb $t1,map($t0) #t1=map[x][y] 69 bne $t1,$zero,return 70 lb $t2,visit($t0) #t2=visit[x][y] 71 bne $t2,$zero,return 72 73 addi $t2,$t2,1 74 sb $t2,visit($t0) #visit[x][y]=1 75 76 addi $sp,$sp,-16 77 78 sw $a0,12($sp) 79 sw $a1,8($sp) 80 sw $t0,4($sp) 81 sw $ra,0($sp) 82 addi $a0,$a0,1 83 jal dfs 84 lw $ra,0($sp) 85 lw $t0,4($sp) 86 lw $a1,8($sp) 87 lw $a0,12($sp) 88 89 sw $a0,12($sp) 90 sw $a1,8($sp) 91 sw $t0,4($sp) 92 sw $ra,0($sp) 93 addi $a0,$a0,-1 94 jal dfs 95 lw $ra,0($sp) 96 lw $t0,4($sp) 97 lw $a1,8($sp) 98 lw $a0,12($sp) 99 100 sw $a0,12($sp) 101 sw $a1,8($sp) 102 sw $t0,4($sp) 103 sw $ra,0($sp) 104 addi $a1,$a1,1 105 jal dfs 106 lw $ra,0($sp) 107 lw $t0,4($sp) 108 lw $a1,8($sp) 109 lw $a0,12($sp) 110 111 sw $a0,12($sp) 112 sw $a1,8($sp) 113 sw $t0,4($sp) 114 sw $ra,0($sp) 115 addi $a1,$a1,-1 116 jal dfs 117 lw $ra,0($sp) 118 lw $t0,4($sp) 119 lw $a1,8($sp) 120 lw $a0,12($sp) 121 122 addi $sp,$sp,16 123 124 sb $zero,visit($t0) #visit[x][y]=0 125 126 return:jr $ra
以上是关于01迷宫的主要内容,如果未能解决你的问题,请参考以下文章