我看到有另外一个问题几乎就是这样,但答案没有达到我想要的目的。
这是作业。我有一个4x4网格和用户输入的开始和结束(x,y)坐标。我需要将此信息从main发送到create_path函数,该函数计算最短路径然后将其发送到另一个函数,该函数逐步打印标记位置的网格,直到它到达所需坐标。我不能使用数组,我必须有main,create_path和print_path。标记只能向上,向下,向左和向右移动。
所以我真的不知道该怎么做。我想为网格中的每个单元格创建一个变量,但不知道从那里去哪里。如果有人知道一个快速的解决方案,只使用main和另一个可以正常的功能,因为我的时间不多了。
您不需要查看main,因为它只是向用户显示网格并要求输入然后将输入发送到此函数:
void create_path(int xStart, int xEnd, int yStart, int yEnd)
{
}
答案 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 必须是递归函数。
给出的条件应该是: