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,
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,的更多相关文章
- java怎么定义一个二维数组?
java中使用 [][] 来定义二维数组 定义数组时也可同时初始化下面是一些例子float[][] numthree; //定义一个float类型的2维数组numthree=new float[5][ ...
- java定义一个二维数组
https://zhidao.baidu.com/question/2052557356110840027.html https://blog.csdn.net/houpengfei111/artic ...
- new一个二维数组
.定义一个二维数组 char **array1 array1 = new char *[x]; for(i=0;i<x;++i) array1[i] = new char[y]; ...用的时候 ...
- <转载>c++中new一个二维数组
原文连接 在c++中定义一个二维数组时有多种方式,下面是几种定义方式的说明:其中dataType 表示数据类型,如int byte long... 1.dataType (*num)[n] = n ...
- ytu 1050:写一个函数,使给定的一个二维数组(3×3)转置,即行列互换(水题)
1050: 写一个函数,使给定的一个二维数组(3×3)转置,即行列互换 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 154 Solved: 112[ ...
- C语言数组:C语言数组定义、二维数组、动态数组、字符串数组
1.C语言数组的概念 在<更加优美的C语言输出>一节中我们举了一个例子,是输出一个 4×4 的整数矩阵,代码如下: #include <stdio.h> #include &l ...
- php中向前台js中传送一个二维数组
在php中向前台js中传送一个二维数组,并在前台js接收获取其中值的全过程方法: (1),方法说明:现在后台将数组发送到前台 echo json_encode($result); 然后再在js页面中的 ...
- 如何用一个for循环打印出一个二维数组
思路分析: 二维数组在内存中默认是按照行存储的,比如一个二维数组{{1,2,3,},{4,5,6}},它在内存中存储的顺序就是1.2.3.4.5.6,也就是说,对于这6个数组元素,按照从0到5给它们编 ...
- poj2155一个二维树状数组
...
- JAVA生成一个二维数组,使中间元素不与相邻的9个元素相等,并限制每一个元素的个数
JAVA生成一个二维数组,使中间元素不与相邻的9个元素相等,并限制每一个元素的个数 示例如下 至少需要九个元素:"A","B","C",&q ...
随机推荐
- gradle设置
本地目录: gradle-wrapper.properties distributionUrl=file\:///D:/\.gradle/gradle-7.3-all.zip distribution ...
- Qt 学习笔记 - 第三章 - Qt的三驾马车之一 - 串口编程 + 程序打包成Windows软件
Qt 学习笔记全系列传送门: Qt 学习笔记 - 第一章 - 快速开始.信号与槽 Qt 学习笔记 - 第二章 - 添加图片.布局.界面切换 [本章]Qt 学习笔记 - 第三章 - Qt的三驾马车之一 ...
- [网鼎杯 2018]Fakebook
1.解题过程 1.sql注入 访问web页面有一个login和join ; // 输出undefined var foo = 2; // let 的情况 console.log( ...
- Linux文件系统故障,Input/output error
事情是这样的,在启动某一个应用程序的时候,出现 Input/output error 的报错,磁盘以及目录无法使用的情况下,进行了重启,重启完成后是可以正常使用的,过一段时间后就会再次出现这个问题,一 ...
- windows通过修改注册表来修改暂停更新时间
但通过修改注册表,我们可以将这个天数修改成自己期望的,比如10年. 在小娜或者运行中输入 regedit 打开注册表编辑器,展开至 HKEY_LOCAL_MACHINE\SOFTWARE\Micros ...
- 【Voyage】GDOI 2023 旅游记 || ECHO.
\(\color{#FFFFFF}{那是什么样的旅途呢}\) \(\color{#FFFFFF}{真的会害怕很多东西呢.想想害怕的其实不止这样一件事,便产生了"其实都一样没关系的,都应该踏过 ...
- Java并发(一)----进程、线程、并行、并发
一.进程与线程 进程 程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU,数据加载至内存.在指令运行过程中还需要用到磁盘.网络等设备.进程就是用来加载指令.管理内存.管理 ...