程序与递归函数和没有全局变量 - C ++

时间:2017-02-01 20:50:04

标签: c++ recursion

我有一个程序,它在二维数组中查找路径"成本"是最低的。这是一个例子(开始: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();
} 

1 个答案:

答案 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();
}