01迷宫

Posted tuoniao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了01迷宫相关的知识,希望对你有一定的参考价值。

01迷宫

  使用深度优先探索算法求解01迷宫的逃离路线个数。

逃跑路线

技术图片

  1. 左图表示的是一个4*5的01矩阵,这个矩阵就是一个01迷宫。
  2. 如左图,以红色0作为起点,绿色0作为终点,每一次行进只能选择上下左右中值为0且未走过的位置,满足上述条件的路线,即为一条迷宫逃跑路线。如右图中,蓝色的路线即为一条逃跑路线。

题目描述

  1. 使用mips实现01迷宫路线数目计算。
  2. 以0x00000000为数据段起始地址。
  3. 输入一个n*m的01矩阵作为01迷宫,并给定他的起点与终点,求出他不同逃跑路线的数目(不同逃跑路线中可以有相同的部分,但是不能完全相同)。
  4. 每组数据最多执行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 

  

提交要求

  1. 请勿使用 .globl main
  2. 不考虑延迟槽
  3. 只需要提交.asm文件。
  4. 程序的初始地址设置为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迷宫的主要内容,如果未能解决你的问题,请参考以下文章

1629 01迷宫

问题 C: 小灰才不走迷宫

问题 C: 小灰才不走迷宫

01迷宫

01迷宫

洛谷——P1141 01迷宫