滑雪場(chǎng)最長(zhǎng)路徑問(wèn)題

問(wèn)題

解法很簡(jiǎn)單,遍歷求解每個(gè)元素的最長(zhǎng)深度,有點(diǎn)類(lèi)似圖的深度遍歷算法,但是還是有些不同,
另外,需要有個(gè)中間表用來(lái)記錄已經(jīng)計(jì)算過(guò)的節(jié)元素的深度,提高運(yùn)行效率, 算法并不是最優(yōu)的,比如說(shuō),如果某個(gè)節(jié)點(diǎn)計(jì)算過(guò)了就不要重復(fù)計(jì)算了

#include <iostream>
#include <vector>
using namespace std;

void Output(const vector<vector<int> > & vecMatrix)
{
    for (auto itr=vecMatrix.begin();
          itr!=vecMatrix.end();
          ++itr)
    {
        for (auto itr2=itr->begin();
              itr2!=itr->end();
              ++itr2)
        {
            cout << *itr2 << " ";
        }
        cout << endl;
    }
}

void CalculateLength(const vector<vector<int> > & vecMatrix,
        vector<vector<int> > & vecLength,
        int i,
        int j,
        int R,
        int C)
{
    int nLeft  = 0;
    int nRight = 0;
    int nTop   = 0;
    int nDown  = 0;

    if (j-1 >= 0 && vecMatrix[i][j-1] < vecMatrix[i][j]) {
        if (vecLength[i][j-1] == 0) {
            CalculateLength(vecMatrix, vecLength, i, j-1, R, C);
        }
        nLeft = vecLength[i][j-1];
    }
    if (j+1 < C && vecMatrix[i][j+1] < vecMatrix[i][j]) {
        if (vecLength[i][j+1] == 0) {
            CalculateLength(vecMatrix, vecLength, i, j+1, R, C);
        }
        nRight = vecLength[i][j+1];
    }
    if (i-1 >= 0 && vecMatrix[i-1][j] < vecMatrix[i][j]) {
        if (vecLength[i-1][j] == 0) {
            CalculateLength(vecMatrix, vecLength, i-1, j, R, C);
        }
        nTop = vecLength[i-1][j];
    }
    if (i+1 < R && vecMatrix[i+1][j] < vecMatrix[i][j]) {
        if (vecLength[i+1][j] == 0) {
            CalculateLength(vecMatrix, vecLength, i+1, j, R, C);
        }
        nDown = vecLength[i+1][j];
    }

    int nMax = nLeft;
    nMax = nMax < nRight ? nRight : nMax;
    nMax = nMax < nTop ? nTop : nMax;
    nMax = nMax < nDown ? nDown : nMax;
    
    vecLength[i][j] = nMax + 1;
}

int CalculateMaxLength(const vector<vector<int> > & vecMatrix) 
{
    vector<vector<int> > vecLength;
    int R = vecMatrix.size();
    int C = vecMatrix[0].size();
    for (int i=0; i<R; ++i) {
        vector<int> vecTmp(C, 0);
        vecLength.push_back(vecTmp);
    }

    for (int i=0; i<R; ++i)
    {
        for (int j=0; j<C; ++j)
        {
            CalculateLength(vecMatrix, vecLength, i, j, R, C);
        }
    }

    int nMaxLength = 0;
    for (int i=0; i<R; ++i)
    {
        for (int j=0; j<C; ++j)
        {
            nMaxLength = nMaxLength < vecLength[i][j] ? vecLength[i][j] : nMaxLength;
        }
    }

    return nMaxLength;
}

int main(int argc, char ** argv)
{
    vector<vector<int> > vecMatrix;
    
    vector<int> vecTmpNum;
    vecTmpNum.resize(5);
    vecTmpNum[0] = 1;
    vecTmpNum[1] = 2;
    vecTmpNum[2] = 3;
    vecTmpNum[3] = 4;
    vecTmpNum[4] = 5;
    vecMatrix.push_back(vecTmpNum);
    vecTmpNum[0] = 16;
    vecTmpNum[1] = 17;
    vecTmpNum[2] = 18;
    vecTmpNum[3] = 19;
    vecTmpNum[4] = 6;
    vecMatrix.push_back(vecTmpNum);
    vecTmpNum[0] = 15;
    vecTmpNum[1] = 24;
    vecTmpNum[2] = 25;
    vecTmpNum[3] = 20;
    vecTmpNum[4] = 7;
    vecMatrix.push_back(vecTmpNum);
    vecTmpNum[0] = 14;
    vecTmpNum[1] = 23;
    vecTmpNum[2] = 22;
    vecTmpNum[3] = 21;
    vecTmpNum[4] = 8;
    vecMatrix.push_back(vecTmpNum);
    vecTmpNum[0] = 13;
    vecTmpNum[1] = 12;
    vecTmpNum[2] = 11;
    vecTmpNum[3] = 10;
    vecTmpNum[4] = 9;
    vecMatrix.push_back(vecTmpNum);

    Output(vecMatrix);

    cout << "MaxLength:" << CalculateMaxLength(vecMatrix) << endl;;

    return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1 序 2016年6月25日夜,帝都,天下著大雨,拖著行李箱和同學(xué)在校門(mén)口照了最后一張合照,搬離寢室打車(chē)去了提前租...
    RichardJieChen閱讀 5,377評(píng)論 0 12
  • 樹(shù)的概述 樹(shù)是一種非常常用的數(shù)據(jù)結(jié)構(gòu),樹(shù)與前面介紹的線性表,棧,隊(duì)列等線性結(jié)構(gòu)不同,樹(shù)是一種非線性結(jié)構(gòu) 1.樹(shù)的定...
    Jack921閱讀 4,762評(píng)論 1 31
  • 基于樹(shù)實(shí)現(xiàn)的數(shù)據(jù)結(jié)構(gòu),具有兩個(gè)核心特征: 邏輯結(jié)構(gòu):數(shù)據(jù)元素之間具有層次關(guān)系; 數(shù)據(jù)運(yùn)算:操作方法具有Log級(jí)的平...
    yhthu閱讀 4,471評(píng)論 1 5
  • 母乳好 你應(yīng)該已經(jīng)學(xué)習(xí)過(guò)了,母乳中有400種營(yíng)養(yǎng)物質(zhì)是配方奶粉里沒(méi)有的。國(guó)際母乳協(xié)會(huì)建議寶寶出生后到半歲前全母乳喂...
    瑩瑩_閱讀 1,329評(píng)論 10 3
  • 1.情緒管理:今天稍有點(diǎn)小磨擦,孩子可能是不是有心的,觸碰了媽媽?zhuān)瑡寢專(zhuān)阂院蟛辉S這樣隨便動(dòng)手,養(yǎng)成壞習(xí)慣不好的,特...
    azhifeng閱讀 177評(píng)論 0 0

友情鏈接更多精彩內(nèi)容