我有一个程序,它在二维数组中查找路径"成本"是最低的。这是一个例子(开始:a [0] [2] - >结束:a [3] [0]):
10 10 1 10
10 10 1 10
10 1 10 10
0 10 10 10
1 -> 1 -> 1 -> 0
在我的情况下,我需要从第0行到第3行进行3步(因此有三个方向可用)。您可以选择列起始编号。
问题是,如果不使用全局变量(min2),我就无法做到这一点。我想我应该使用" int"不是"无效"那么递归函数。
这是我的代码:
#include<iostream>
#include<climits>
using namespace std;
int a[4][4] = {10, 10, 1, 10, 10, 10, 1, 10, 10, 1 ,10, 10, 0, 10, 10, 10};
int min2=INT_MAX;
int k=2; //column start number
bool can_go(int x, int y){
if(x<0 || x>3 || y<0 || y>3)
return false;
return true;
}
void min_path(int x, int y, int steps, int result){
if(x==3 && steps==3){
if(result<min2)
min2=result;
}
else{
if(can_go(x+1,y)){
min_path(x+1,y,steps+1,result+a[x+1][y]);
}
if(can_go(x+1,y-1)){
min_path(x+1,y-1,steps+1,result+a[x+1][y-1]);
}
if(can_go(x+1,y+1)){
min_path(x+1,y+1,steps+1,result+a[x+1][y+1]);
}
}
}
int go(){
min_path(0,k,0,a[0][k]);
return min2;
}
int main(){
cout << go();
}
答案 0 :(得分:0)
可以通过在每次递归调用时返回最小值来完成。然后,比较操作将在非叶节点中完成。在原始代码中,比较操作在叶节点中完成(基本情况)。新功能如下所示:
#include<iostream>
#include<climits>
using namespace std;
int a[4][4] = {10, 10, 1, 10, 10, 10, 1, 10, 10, 1 ,10, 10, 0, 10, 10, 10};
int k=2; //column start number
bool can_go(int x, int y){
if(x<0 || x>3 || y<0 || y>3)
return false;
return true;
}
int min_path(int x, int y, int steps, int result){
if(x==3 && steps==3){
return result;
}
else{
int min = INT_MAX;
if(can_go(x+1,y)){
int b = min_path(x+1,y,steps+1,result+a[x+1][y]);
if (b<min)
min=b;
}
if(can_go(x+1,y-1)){
int b = min_path(x+1,y-1,steps+1,result+a[x+1][y-1]);
if (b<min)
min=b;
}
if(can_go(x+1,y+1)){
int b = min_path(x+1,y+1,steps+1,result+a[x+1][y+1]);
if (b<min)
min=b;
}
return min;
}
}
int go(){
return min_path(0,k,0,a[0][k]);
}
int main(){
cout << go();
}