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

 

转载于:https://www.cnblogs.com/tuoniao/p/10348685.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,让我来帮你解决这个问题。这个问题可以用广度优先搜索算法来解决。我们可以从起点开始,依次遍历每个可行的位置,直到找到终点为止。在遍历的过程中,我们需要记录每个位置的步数和路径,以便在找到终点后输出路径。 以下是解决这个问题的伪代码: 1. 初始化起点的步数为0,路径为空,将起点加入队列中 2. 当队列不为空时,取出队首元素 3. 如果当前位置为终点,输出路径并结束程序 4. 遍历当前位置的四个方向,如果该方向可行且未被访问过,则将该位置加入队列中,并更新步数和路径 5. 如果有多个位置步数相同,选择字典序最小的那个位置 6. 重复步骤2-5,直到找到终点或队列为空 以下是实现这个算法的Python代码: from queue import Queue n, m = map(int, input().split()) maze = [list(map(int, input().split())) for _ in range(n)] dx = [0, 0, -1, 1] dy = [-1, 1, 0, 0] visited = [[False] * m for _ in range(n)] steps = [[float('inf')] * m for _ in range(n)] paths = [[''] * m for _ in range(n)] q = Queue() q.put((0, 0)) visited[0][0] = True steps[0][0] = 0 paths[0][0] = '0' while not q.empty(): x, y = q.get() if x == n - 1 and y == m - 1: print(paths[x][y]) break for i in range(4): nx, ny = x + dx[i], y + dy[i] if 0 <= nx < n and 0 <= ny < m and not visited[nx][ny] and maze[nx][ny] == 0: visited[nx][ny] = True steps[nx][ny] = steps[x][y] + 1 if steps[nx][ny] == steps[x][y] + 1: paths[nx][ny] = min(paths[nx][ny], paths[x][y] + str(i)) else: paths[nx][ny] = paths[x][y] + str(i) q.put((nx, ny)) 如果你有任何问题或需要进一步的解释,请随时问我。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值