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

时间:2016-02-01 06:44:29

标签: c++ shortest-path

我看到有另外一个问题几乎就是这样,但答案没有达到我想要的目的。

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

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

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

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

}

2 个答案:

答案 0 :(得分:1)

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

这已经是答案了......

一般来说,如何找到从(xStart,yStart)到(xEnd,yEnd)的最短路径?你只是再做同样的事情。它是"对xEnd-xStart,向下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--;
     }
}

答案 1 :(得分:0)

create_path 必须是递归函数。

给出的条件应该是:

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