- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 20x30
矩阵,其中填充了随机数 [ 0, 1, 2 ]
。我需要找到一条仅由 1 组成的路径,从左上角开始到右下角结束。我需要帮助找到 1 的路径。另外,如何打印我所踏过的每个数字的坐标?我可以显示我所踏过的数字,但在显示其坐标时遇到问题。这是我当前的代码
#include <iostream>
#include <vector>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
const int N = 3;
const int M = 3;
void mtxFeltolt(int (&mat)[N][M]);
void mtxPrint(int (&mat)[N][M]);
void printPaths(int mat[M][N], vector<int> &route, int i, int j)
{
// if last cell is reached
if (i == M - 1 && j == N - 1)
{
// print the current route
for (int i: route) {
cout << i << " - ";
}
cout << mat[i][j] << endl;
return;
}
// include current cell in route
route.push_back(mat[i][j]);
// move right
if (j + 1 < N){
printPaths(mat, route, i, j + 1);
}
// move down
if (i + 1 < M){
printPaths(mat, route, i + 1, j);
}
// move diagonally
if (i + 1 < M && j + 1 < N){
printPaths(mat, route, i + 1, j + 1);
}
// backtrack
route.pop_back();
}
// Print all shortest routes in a rectangular grid
void printPaths(int mat[][N])
{
// vector to store current route
vector<int> route;
// start from the first cell (0, 0)
printPaths(mat, route, 0, 0);
}
// main function
int main()
{
int mat[N][M];
srand (time(NULL));
mtxFeltolt(mat);
cout << "A matrix: " <<endl;
mtxPrint(mat);
cout << endl;
cout << "---- A megfelelo utak ----" << endl;
printPaths(mat);
return 0;
}
void mtxFeltolt(int (&mat)[N][M]){
for(int i=0; i < N; i++){
for(int j=0; j < M; j++)
mat[i][j] = rand() % 3;
}
}
void mtxPrint(int (&mat)[N][M]){
for(int i=0; i < N; i++){
for(int j = 0; j < M; j++){
cout << mat[i][j] << " ";
}
cout << endl;
}
}
最佳答案
希望您能遵循此代码。我没有使用 std::pair ,而是创建了一个简单的结构体 Coord 来包含路径中坐标的行和列。这样更容易阅读。我还提供了一种更好的生成随机数的方法。
我使用深度优先搜索来查找路径。它不保证最短路径,但会找到从左上角到右下角的路径。
#include <algorithm>
#include <iostream>
#include <random>
#include <vector>
struct Coord {unsigned long row, col;};
template<typename T>
using Matrix = std::vector<std::vector<T>>;
using Path = std::vector<Coord>;
/**
* Generate a random number from [low, high]
*
* @param low The lower bound
* @param high The upper bound
* @return A random number on the range [low, high]
*/
int random_int(int low, int high)
{
static std::random_device rd;
// static std::mt19937 mt(rd()); // different random numbers each time
static std::mt19937 mt(30); // seed that generates a matrix with a path
std::uniform_int_distribution<> dist(low, high);
return dist(mt);
}
Matrix<int> generateMatrix(const int m, const int n)
{
Matrix<int> mat;
for(int row = 0; row < m; ++row)
{
mat.push_back({});
for(int col = 0; col < n; ++col)
{
mat[row].push_back(random_int(0,2));
}
}
return mat;
}
void print(const Matrix<int>& mat)
{
for(const auto & row : mat)
{
for(const auto & col : row)
std::cout << col << " ";
std::cout << std::endl;
}
}
Path findPath(const Matrix<int>& mat,
Matrix<bool>& visited,
const Coord cur,
const Coord end)
{
// out of range -> no path
if(cur.row < 0
|| cur.row >= mat.size()
|| cur.col < 0
|| cur.col >= mat[0].size())
{
return {};
}
// visited current location -> no path
if(visited[cur.row][cur.col])
{
return {};
}
visited[cur.row][cur.col] = true;
// current location is not a 1 -> no path
if(mat[cur.row][cur.col] != 1)
{
return {};
}
// if at the end, the path is trivial
if(cur.row == end.row && cur.col == end.col)
{
return {cur};
}
Path p {cur};
std::vector<Path> paths;
// try to go in each direction
// right
paths.push_back(findPath(mat, visited, {cur.row, cur.col+1}, end));
// left
paths.push_back(findPath(mat, visited, {cur.row, cur.col-1}, end));
// up
paths.push_back(findPath(mat, visited, {cur.row-1, cur.col}, end));
// down
paths.push_back(findPath(mat, visited, {cur.row+1, cur.col}, end));
// up-right
paths.push_back(findPath(mat, visited, {cur.row-1, cur.col+1}, end));
// down-right
paths.push_back(findPath(mat, visited, {cur.row+1, cur.col+1}, end));
// down-left
paths.push_back(findPath(mat, visited, {cur.row+1, cur.col-1}, end));
// up-left
paths.push_back(findPath(mat, visited, {cur.row-1, cur.col-1}, end));
Path longest = *std::max_element(paths.begin(), paths.end(),
[](const auto a, const auto b){
return a.size() < b.size();
});
p.insert(p.end(), longest.begin(), longest.end());
return p;
}
Path findPath(const Matrix<int>& mat,
const Coord cur,
const Coord end)
{
Matrix<bool> visited;
for(int row = 0; row < mat.size(); ++row)
{
visited.push_back({});
for(int col = 0; col < mat[0].size(); ++col)
{
visited[row].push_back(false);
}
}
return findPath(mat, visited, cur, end);
}
int main()
{
auto mat = generateMatrix(5, 5);
print(mat);
auto path = findPath(mat, {0, 0}, {mat.size()-1, mat[0].size()-1});
if(path.size() > 0
&& path.back().row == mat.size()-1 && path.back().col == mat[0].size()-1)
{
std::cout << "path length: " << path.size() << std::endl;
for(const auto c : path)
{
std::cout << "(" << c.row << ", " << c.col << ")" << std::endl;
}
}
else
std::cout << "no path" << std::endl;
}
关于c++ - 在矩阵中查找从左上角到右下角的路径时遇到问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60643159/
假设我有两个矩阵,每个矩阵有两列和不同的行数。我想检查并查看一个矩阵的哪些对在另一个矩阵中。如果这些是一维的,我通常只会做 a %in% x得到我的结果。 match似乎只适用于向量。 > a
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 个月前。 Improv
我只处理过 DirectX 矩阵 我读过一些文章,说不能将 DirectX 矩阵数学库用于 openGL 矩阵。 但我也读过,如果你的数学是一致的,你可以获得类似的结果。那只会让我更加困惑。 任何人都
我编写了一个C++代码来解决线性系统A.x = b,其中A是一个对称矩阵,方法是首先使用LAPACK(E)对角矩阵A = V.D.V^T(因为以后需要特征值),然后求解x = A^-1.b = V^T
我遇到了问题。我想创建二维数组 rows=3 cols=2我的代码如下 int **ptr; int row=3; int col=2; ptr=new int *[col]; for (int i=
我有一个 3d mxnxt 矩阵,我希望能够提取 t 2d nxm 矩阵。在我的例子中,我有一个 1024x1024x10 矩阵,我想要 10 张图像显示给我。 这不是 reshape ,我每次只需要
我在 MATLAB 中有一个 3d 矩阵 (n-by-m-by-t) 表示一段时间内网格中的 n-by-m 测量值.我想要一个二维矩阵,其中空间信息消失了,只剩下 n*m 随着时间 t 的测量值(即:
作为一个简化的示例,我有一个 3D numpy 矩阵,如下所示: a = np.array([[[1,2], [4,np.nan], [7,
作为一个简化的示例,我有一个 3D numpy 矩阵,如下所示: a = np.array([[[1,2], [4,np.nan], [7,
使用 eigen2 , 并给定一个矩阵 A a_0_0, a_0_1, a_0_2, ... a_1_0, a_1_0, a_1_2, ... ... 和一个矩阵B: b_0_0, b_0_1, b_
我想知道如何获得下面的布局。 在中型和大型设备上,我希望有 2 行和 2 列的布局(2 x 2 矩阵)。 在小型(和超小型)设备上或调整为小型设备时,我想要一个 4 行和 1 列的矩阵。 我将通过 a
有什么方法可以向量化以下内容: for i = 1:6 te = k(:,:,:,i).*(c(i)); end 我正在尝试将 4D 矩阵 k 乘以向量 c,方法是将其
如何从填充有 1 和 0 的矩阵中抽取 n 个随机点的样本? a=rep(0:1,5) b=rep(0,10) c=rep(1,10) dataset=matrix(cbind(a,b,c),nrow
我正在尝试创建一个包含 X 个 X 的矩阵。以下代码生成从左上角到右下角的 X 对 Angular 线,而不是从右上角到左下角的 X 对 Angular 线。我不确定从哪里开始。是否应该使用新变量创建
我想在 python 中创建一个每行三列的矩阵,并能够通过任何一行对它们进行索引。矩阵中的每个值都是唯一的。 据我所知,我可以设置如下矩阵: matrix = [["username", "name"
我有点迷茫 我创建了一个名为 person 的类,它具有 age 和 name 属性(以及 get set 方法)。然后在另一个类中,我想创建一个 persons 数组,其中每个人都有不同的年龄和姓名
我有 n 个类,它们要么堆叠,要么不堆叠。所有这些类都扩展了同一个类 (CellObject)。我知道更多类将添加到此列表中,我想创建一种易于在一个地方操纵“可堆叠性”的方法。 我正在考虑创建一个矩阵
我有一个包含 x 个字符串名称及其关联 ID 的文件。本质上是两列数据。 我想要的是一个格式为 x x x 的相关样式表(将相关数据同时作为 x 轴和 y 轴),但我想要 fuzzywuzzy 库的函
机器学习与传统编程的一个重要区别在于机器学习比传统编程涉及了更多的数学知识。不过,随着机器学习的飞速发展,各种框架应运而生,在数据分析等应用中使用机器学习时,使用现成的库和框架成为常态,似乎越来越不需
当我在 julia 中输入这个错误跳转但我不知道为什么,它应该工作。/ julia> A = [1 2 3 4; 5 6 7 8; 1 2 3 4; 5 6 7 8] 4×4 Array{Int64,
我是一名优秀的程序员,十分优秀!