从左上角到右下角的矩阵中的可能路径

时间:2016-12-05 19:50:06

标签: c++ algorithm

我试图找到矩阵(m,n)从左上角到右下角的路径数。我还想存储所有这些可能的路径。 我已经解决了使用DP的路径数量。 T:O(m n),S:O(m n) 我也解决了查找和存储所有路径的问题;然而,在这里,我的空间复杂性是一团糟。大致:O(max(m,n)^ 4)~O(m ^ 4)/ O(n ^ 4)中较大者。

我已经分配了一个2D数组来存储路径。但是这个数组的每个元素都需要是一个路径列表,这很令人不安。我在这里展示了我的代码,经过测试和工作。 有更好的解决方案吗?

void T(int **&A, vector<vector<pair<int, int> > > **&P, int m, int n) {
    vector<vector<pair<int, int> > > v1, v2;
    vector<pair<int,int> > v11, v22;
    pair<int,int> p1(m-1,0), p2(0,n-1);

    v11.push_back(p1);
    v22.push_back(p2);
    v1.push_back(v11);
    v2.push_back(v22);
    P[m-1][0] = v1;
    P[0][n-1] = v2;
    for (int i = m-1; i >= 0; i--) {
        A[i][0] = 1;
        pair<int,int> pi(i,0);
        if (i != m-1) {
            P[i+1][0][0].insert(P[i+1][0][0].begin(),pi);
            vector<pair<int,int> > tt = P[i+1][0][0];
            vector<vector<pair<int,int> > > kk;
            kk.push_back(tt);
            P[i][0] = kk;
        }
    }
    for (int i = n-1; i >= 0; i--) {
        A[0][i] = 1;
        pair<int,int> pi(0,i);
        if (i != n-1) {
            P[0][i+1][0].insert(P[0][i+1][0].begin(),pi);
            vector<pair<int,int> > tt = P[0][i+1][0];
            vector<vector<pair<int,int> > > kk;
            kk.push_back(tt);
            P[0][i] = kk;
        }
    }
    for (int i = 1; i < m; i++)
    for (int j = 1; j < n; j++) {
        A[i][j] = A[i-1][j] + A[i][j-1];
        pair<int,int> pij(i,j);
        vector<vector<pair<int,int> > > vv = P[i-1][j];
        vector<vector<pair<int,int> > > ww = P[i][j-1];

        for (int k = 0; k < vv.size(); k++) {
            vv[k].push_back(pij);
        }
        for (int k = 0; k < ww.size(); k++) {
            ww[k].push_back(pij);
            vv.push_back(ww[k]);
        }
        P[i][j] = vv;
    }
}

void PrintPaths(vector<vector<pair<int, int> > > **&P, int m, int n) {
    vector<vector<pair<int,int> > > vv = P[m-1][n-1];

    for (int i = 0; i < vv.size(); i++) {
        for (int j = 0; j < vv[i].size(); j++) {
            cout<<"("<<vv[i][j].first<<","<<vv[i][j].second<<")";
            if (j != vv[i].size()-1)
                cout<<"->";
        }
        cout<<endl;
    }
}

int main() {
    int m = 2;
    int n = 2;
    int **A = new int*[m];
    vector<vector<pair<int,int> > > **P = new vector<vector<pair<int,int> > >*[m];
    for (int i = 0; i < m; i++) {
        A[i] = new int[n];
        P[i] = new vector<vector<pair<int,int> > >[n];
    }
    T(A,P,m,n);
    PrintPaths(P,m,n);

    for (int i = 0; i < m; i++) {
        delete[] A[i];
        delete[] P[i];
    }
    delete[] A;
    delete[] P;

    return 0;
}

0 个答案:

没有答案