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

时间: 2024-10-11 22:21:40

01迷宫的相关文章

luogu P1141 01迷宫 x

P1141 01迷宫 题目描述 有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上. 你的任务是:对于给定的迷宫,询问从某一格开始能移动到多少个格子(包含自身). 输入输出格式 输入格式: 输入的第1行为两个正整数n,m. 下面n行,每行n个字符,字符只可能是0或者1,字符之间没有空格. 接下来m行,每行2个用空格分隔的正整数i,j,对应了迷宫中第i行第j列的一个格子,询问从这一格开始能移

洛谷OJ P1141 01迷宫 解题报告

洛谷OJ P1141 01迷宫 解题报告 by MedalPluS [题目描述]    有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上.你的任务是:对于给定的迷宫,询问从某一格开始能移动到多少个格子(包含自身).   [输入描述]   输入的第1行为两个正整数n,m.  下面n行,每行n个字符,字符只可能是0或者1,字符之间没有空格.  接下来m行,每行2个用空格分隔的正整数i,j,对

1629 01迷宫

1629 01迷宫 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 有一个由01组成的n*n格迷宫,若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上.那么对于给定的迷宫,询问从某一格开始能移动到多少格. 输入描述 Input Description 输入的第1行为两个正整数n,m. 下面n行,每行n个字符,字符只可能是0或者1,字符之

【luouP1141】01迷宫

1141 01迷宫 题目描述 有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上. 你的任务是:对于给定的迷宫,询问从某一格开始能移动到多少个格子(包含自身). 输入输出格式 输入格式: 输入的第1行为两个正整数n,m. 下面n行,每行n个字符,字符只可能是0或者1,字符之间没有空格. 接下来m行,每行2个用空格分隔的正整数i,j,对应了迷宫中第i行第j列的一个格子,询问从这一格开始能移动

洛谷——P1141 01迷宫

https://www.luogu.org/problem/show?pid=1141 题目描述 有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上. 你的任务是:对于给定的迷宫,询问从某一格开始能移动到多少个格子(包含自身). 输入输出格式 输入格式: 输入的第1行为两个正整数n,m. 下面n行,每行n个字符,字符只可能是0或者1,字符之间没有空格. 接下来m行,每行2个用空格分隔的正整

P1141 01迷宫

题目描述 有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上. 你的任务是:对于给定的迷宫,询问从某一格开始能移动到多少个格子(包含自身). 输入输出格式 输入格式: 输入的第1行为两个正整数n,m. 下面n行,每行n个字符,字符只可能是0或者1,字符之间没有空格. 接下来m行,每行2个用空格分隔的正整数i,j,对应了迷宫中第i行第j列的一个格子,询问从这一格开始能移动到多少格. 输出格式

luogu cogs P1141 01迷宫

题目描述 有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上. 你的任务是:对于给定的迷宫,询问从某一格开始能移动到多少个格子(包含自身). 输入输出格式 输入格式: 输入的第1行为两个正整数n,m. 下面n行,每行n个字符,字符只可能是0或者1,字符之间没有空格. 接下来m行,每行2个用空格分隔的正整数i,j,对应了迷宫中第i行第j列的一个格子,询问从这一格开始能移动到多少格. 输出格式

P1141 01迷宫(连通块模板)

题目描述 有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上. 你的任务是:对于给定的迷宫,询问从某一格开始能移动到多少个格子(包含自身). 输入格式 第1行为两个正整数n,m. 下面n行,每行n个字符,字符只可能是0或者1,字符之间没有空格. 接下来m行,每行2个用空格分隔的正整数i,j,对应了迷宫中第i行第j列的一个格子,询问从这一格开始能移动到多少格. 输出格式 m行,对于每个询问输

noip 01迷宫(BFS+记忆化)

题目链接:https://www.luogu.org/problem/show?pid=1141 题意:给出一个仅由数字0与1组成的n×n格迷宫.放0的那一格可以4个方向走到放1那一格,1也是四个方向走到放0的那一格.算上本身的那格.求最多能移动多少格子. 数据比较大,如果直接用bfs搜的话会暴时.所以需要每次搜索完都记录一下. 1 #include <iostream> 2 #include <algorithm> 3 #include <queue> 4 using