4x4 网格 c++ 上的最短路径

Shortest path on 4x4 grid c++

本文关键字:最短路径 c++ 网格 4x4      更新时间:2023-10-16

我看到还有另一个问题几乎就像这样,但答案并没有按照我想要的方式进行。

这是针对作业的。 我有一个 4x4 网格和一个用户输入的开始和结束 (x,y( 坐标。 我需要将此信息从 main 发送到一个 create_path 函数,该函数计算最短路径,然后将其发送到另一个函数,该函数逐步打印标记位置的网格,直到它到达所需的坐标。我不能使用数组,我必须有主数组、create_path数组和print_path数组。 标记只能向上、向下、向左和向右移动。

所以我真的不知道该怎么办。我想过为网格中的每个单元格创建一个变量,但不知道从那里开始。 如果有人知道一个只使用 main 和另一个功能的快速解决方案,那没关系,因为我的时间不多了。

你不需要看到 main,因为它只是向用户显示网格并要求他们输入,然后将输入发送到此函数:

void create_path(int xStart, int xEnd, int yStart, int yEnd)
{
}

正如您在评论中已经指出的那样,从 (0,2( 到 (3,1( 的最短路径是"右 3 向下 1",换句话说:右 3-0=3 和向下 2-1=1

这已经是差不多的答案了...

一般来说,如何找到从(xStart,yStart(到(xEnd,yEnd(的最短路径?你只是再次做和以前一样的事情。它是"right xEnd-xStart, down yEnd-yStart"。

因此,print_path函数所需要的只是"我从哪里开始"和"我向右/向左走多少,向上/向下走多少?

因此,您可以在create_path中使用两个变量

int right = xEnd-xStart;
int down = yEnd-yStart;

然后你把这些发送给print_path。您尚未提供print_path的签名,但它可能如下所示:

void print_path(int xStart, int yStart, int right, int down) 
{
}

在此函数中,您只需执行两个循环:

int i = xStart;
int xend = xStart + right; // observe: if right is negative, it's just subtraction
bool right = (right >= 0); // are we going right or left?
while(i != xend) {
     std::cout << "next waypoint: x = " << i << ", y = " << yStart << std::endl;
     if (right) {
          i++;
     } else {
          i--;
     }
}

现在你对 y 坐标做同样的事情

int j = yStart;
int yend = yStart + down; 
bool down = (down >= 0); // are we going down or up?
while(j != yend) {
     std::cout << "next waypoint: x = " << xend << ", y = " << j << std::endl;
     if (down) {
          j++;
     } else {
          j--;
     }
}

create_path必须是递归函数。

给出的条件应该是:

  1. 首先检查点是否在边界内
  2. 然后检查该点是否是所需的点,如果是,则返回
  3. 否则,对
  4. 上、下、左、右和对角线点递归。