2023-03-04:定义一个二维数组NM,比如55数组下所示:
0, 1, 0, 0, 0,
0, 1, 1, 1, 0,
0, 0, 0, 0, 0,
0, 1, 1, 1, 0,
0, 0, 0, 1, 0,
它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,
只能横着走或竖着走,不能斜着走,
要求编程序找出从左上角到右下角距离最短的路线。
示例输出:
[(0,0) (1,0) (2,0) (2,1) (2,2) (2,3) (2,4) (3,4) (4,4)]。

答案2023-03-04:

dijkstra算法。

代码用rust编写。代码如下:

use std::iter::repeat;
fn main() {
let inputs = vec![
5, 5, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0,
];
let mut ii = 0;
let n = inputs[ii];
ii += 1;
let m = inputs[ii];
ii += 1;
let mut map: Vec<Vec<i32>> = repeat(repeat(0).take(m as usize).collect())
.take(n as usize)
.collect();
for i in 0..n {
for j in 0..m {
map[i as usize][j as usize] = inputs[ii];
ii += 1;
}
}
let mut ans = dijkstra(n, m, &mut map);
ans.reverse();
println!("{:?}", ans);
} // n : n行
// m : m列
// map :
// 0 1 1 1
// 0 0 0 1
// 1 1 0 1
// 0 0 0 0
// list = [0,0] , [1,0], [1,1]...[3,3]
// [3,3] -> [0,0]
fn dijkstra(n: i32, m: i32, map: &mut Vec<Vec<i32>>) -> Vec<Vec<i32>> {
// (a,b) -> (c,d)
// last[c][d][0] = a
// last[c][d][1] = b
// 从哪到的当前(c,d)
let mut last: Vec<Vec<Vec<i32>>> = repeat(
repeat(repeat(0).take(2).collect())
.take(m as usize)
.collect(),
)
.take(n as usize)
.collect(); // int[] arr = {c,d,w}
// 0 1 距离
//PriorityQueue<int[]> heap = new PriorityQueue<>((a, b) -> a[2] - b[2]);
let mut heap: Vec<Vec<i32>> = vec![]; let mut visited: Vec<Vec<bool>> = repeat(repeat(false).take(m as usize).collect())
.take(n as usize)
.collect();
heap.push(vec![0, 0, 0]);
let mut ans: Vec<Vec<i32>> = vec![];
while heap.len() > 0 {
heap.sort_by(|a, b| a[2].cmp(&b[2]));
let mut cur = heap.pop().unwrap();
let x = cur[0];
let y = cur[1];
let w = cur[2];
if x == n - 1 && y == m - 1 {
break;
}
if visited[x as usize][y as usize] {
continue;
}
// (x,y)这个点
visited[x as usize][y as usize] = true;
add(
x,
y,
x - 1,
y,
w,
n,
m,
map,
&mut visited,
&mut heap,
&mut last,
);
add(
x,
y,
x + 1,
y,
w,
n,
m,
map,
&mut visited,
&mut heap,
&mut last,
);
add(
x,
y,
x,
y - 1,
w,
n,
m,
map,
&mut visited,
&mut heap,
&mut last,
);
add(
x,
y,
x,
y + 1,
w,
n,
m,
map,
&mut visited,
&mut heap,
&mut last,
);
}
let mut x = n - 1;
let mut y = m - 1;
while x != 0 || y != 0 {
ans.push(vec![x, y]);
let lastX = last[x as usize][y as usize][0];
let lastY = last[x as usize][y as usize][1];
x = lastX;
y = lastY;
}
ans.push(vec![0, 0]);
return ans;
}
// 当前是从(x,y) -> (i,j)
// 左上角 -> (x,y) , 距离是w
// 左上角 -> (x,y) -> (i,j) w+1
// 行一共有n行,0~n-1有效
// 列一共有m行,0~m-1有效
// map[i][j] == 1,不能走!是障碍!
// map[i][j] == 0,能走!是路!
// 把记录加入到堆里,所以得有heap
// last[i][j][0] = x
// last[i][j][1] = y
fn add(
x: i32,
y: i32,
i: i32,
j: i32,
w: i32,
n: i32,
m: i32,
map: &mut Vec<Vec<i32>>,
visited: &mut Vec<Vec<bool>>,
heap: &mut Vec<Vec<i32>>,
last: &mut Vec<Vec<Vec<i32>>>,
) {
if i >= 0
&& i < n
&& j >= 0
&& j < m
&& map[i as usize][j as usize] == 0
&& !visited[i as usize][j as usize]
{
heap.push(vec![i, j, w + 1]);
last[i as usize][j as usize][0] = x;
last[i as usize][j as usize][1] = y;
}
}

2023-03-04:定义一个二维数组N*M,比如5*5数组下所示: 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,的更多相关文章

  1. java怎么定义一个二维数组?

    java中使用 [][] 来定义二维数组 定义数组时也可同时初始化下面是一些例子float[][] numthree; //定义一个float类型的2维数组numthree=new float[5][ ...

  2. java定义一个二维数组

    https://zhidao.baidu.com/question/2052557356110840027.html https://blog.csdn.net/houpengfei111/artic ...

  3. new一个二维数组

    .定义一个二维数组 char **array1 array1 = new char *[x]; for(i=0;i<x;++i) array1[i] = new char[y]; ...用的时候 ...

  4. <转载>c++中new一个二维数组

    原文连接 在c++中定义一个二维数组时有多种方式,下面是几种定义方式的说明:其中dataType 表示数据类型,如int  byte  long... 1.dataType (*num)[n] = n ...

  5. ytu 1050:写一个函数,使给定的一个二维数组(3×3)转置,即行列互换(水题)

    1050: 写一个函数,使给定的一个二维数组(3×3)转置,即行列互换 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 154  Solved: 112[ ...

  6. C语言数组:C语言数组定义、二维数组、动态数组、字符串数组

    1.C语言数组的概念 在<更加优美的C语言输出>一节中我们举了一个例子,是输出一个 4×4 的整数矩阵,代码如下: #include <stdio.h> #include &l ...

  7. php中向前台js中传送一个二维数组

    在php中向前台js中传送一个二维数组,并在前台js接收获取其中值的全过程方法: (1),方法说明:现在后台将数组发送到前台 echo json_encode($result); 然后再在js页面中的 ...

  8. 如何用一个for循环打印出一个二维数组

    思路分析: 二维数组在内存中默认是按照行存储的,比如一个二维数组{{1,2,3,},{4,5,6}},它在内存中存储的顺序就是1.2.3.4.5.6,也就是说,对于这6个数组元素,按照从0到5给它们编 ...

  9. poj2155一个二维树状数组

                                                                                                         ...

  10. JAVA生成一个二维数组,使中间元素不与相邻的9个元素相等,并限制每一个元素的个数

    JAVA生成一个二维数组,使中间元素不与相邻的9个元素相等,并限制每一个元素的个数 示例如下 至少需要九个元素:"A","B","C",&q ...

随机推荐

  1. 05-Spring的AOP编程之基于注解开发

    Spring的AOP基于注解的开发 首先在AOP配置文件中,开启注解的aop开发 <aop:aspectj-autoproxy></aop:aspectj-autoproxy> ...

  2. angularJS依赖注入的个人理解

    依赖注入:一句话 --- 没事你不要来找我,有事我会去找你. AngularJS    5个核心组件用来作为依赖注入: value factory service provider constant ...

  3. JavaWeb笔记第一弹

    一.MYSQL的安装 1.MYSQL的安装 可以去官网找到与自身计算机向对应的版本进行下载 网址如下: MySQL :: Download MySQL Community Server 2.MYSQL ...

  4. 使用ELRepo升级CentOS内核

    在腾讯云中部署了一些服务器,操作系统使用的是CentOS 7.6,但是其默认内核版本较低,现使用ELRepo对CentOS的内核进行升级. 操作环境 服务器:腾讯云轻量应用服务器 操作系统:CentO ...

  5. 20张图说清楚 IP 协议

    大家好,我是风筝 轻解网络系列又来了,今天咱们说说 IP 协议,这可是网络协议中最最核心的一个协议了,还记得我们刚刚知道什么是IP地址.怎么给电脑修改 IP 的时候吗?今天我们就来探究一下 IP 协议 ...

  6. Skywalking 链路追踪

    Skywalking 根据官方的解释,Skywalking是一个可观测性平台(Observability Analysis Platform简称 OAP)和应用性能管理系统(Application P ...

  7. 003-Cruehead-CrackMeV3

    第二个需要写注册机 首先查看文件,打开文件,什么也没有,help ->about,弹出下面的弹窗 看来是没有什么线索,直接放进OD里面 这里有一个函数CreatFileA,这个函数目的是访问一个 ...

  8. 官方文档 | 【JVM调优体系】「GC底层调优实战」XPocket为终结性能问题而生—开发指南

    XPocket 用户文档 XPocket 是PerfMa为终结性能问题而生的开源的插件容器,它是性能领域的乐高,将定位或者解决各种性能问题的常见的Linux命令,JDK工具,知名性能工具等适配成各种X ...

  9. 一文总结你需要的OpenCV操作

    目录 一.OpenCV简介 1.1 OpenCV是什么 1.2 安装及使用 二.图像的基础 2.1 成像原理 2.2 图像格式 2.3 颜色空间 三.OpenCV基础操作 3.1 图像的读取.显示.保 ...

  10. [原创][luogu]P1217 回文质数 真·生成回文的方法

    不多说,直接看代码,都在注释里 // 中心思想: // * 1. 代入数据只想回文的一半和位数的变化 // * 例. 1001 和 101 都存的是10, 但是位数一个是4, 一个是3 // * 2. ...