hurbust 1179 下山【dfs深度優先搜索】

下山
Time Limit: 1000 MSMemory Limit: 65536 K
Total Submit: 902(341 users)Total Accepted: 405(306 users)Rating:Special Judge: No
Description

下面的矩陣可以想象成鳥瞰一座山,矩陣內的數據可以想象成山的高度。

可以從任意一點開始下山。每一步的都可以朝“上下左右”4個方向行走,前提是下一步所在的點比當前所在點的數值小。

例如處在18這個點上,可以向上、向左移動,而不能向右、向下移動。

 1  2  3  4 5

16 17 18 19 6

15 24 25 20 7

14 23 22 21 8

13 12 11 10 9

問題是,對於這種的矩陣,請計算出最長的下山路徑。
對於上面所給出的矩陣,最長路徑爲25-24-23-22-21-20-19-18-17-16-15-14-13-12-11-10-9-8-7-6-5-4-3-2-1,應輸出結果25。
Input

輸入包括多組測試用例。

對於每個用例,第一行包含兩個正整數R和C分別代表矩陣的行數和列數。(1 <= R,C <= 100)

從第二行開始是一個R行C列矩陣,每點的數值在[0,10000]內。

Output
輸出最長的下山路徑的長度。
Sample Input
5 5
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
Sample Output
25
Hint
深度優先搜索
Author
盧俊達

思路:深度優先搜索

注意:每一個數都要進行深度優先搜索

題解:

#include<bits/stdc++.h>
using namespace std;
#define M(a,b) memset(a,b,sizeof(a))
const int MAXN=105;
int n,m;
int vis[MAXN][MAXN];
int MAP[MAXN][MAXN];
int MAX;
int X[5]= {0,0,0,1,-1};
int Y[5]= {0,1,-1,0,0};
int dfs(int x,int y)
{
    if(vis[x][y])///如果被訪問過了,就返回上一層
        return vis[x][y];
    vis[x][y]=1;
    for(int i=1; i<=4; i++)
    {
        int xx=x+X[i];
        int yy=y+Y[i];
        if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&MAP[xx][yy]<MAP[x][y])
            vis[x][y]=max(dfs(xx,yy)+1,vis[x][y]);///用vis數組記錄此時的最大值
    }
    return vis[x][y];

}
int main()
{

    while(~scanf("%d %d",&n,&m))
    {
         M(vis,0);
        for(int i=1; i<=n; i++)
            for(int j=1;j<=m; j++)
                scanf("%d",&MAP[i][j]);
            MAX=0;
        for(int i=1; i<=n; i++)
        {
            for(int j=1; j<=m; j++)
            {

                MAX=max(dfs(i,j),MAX);///對每一個數都進行深度搜索,比較找出最長的路徑

            }
        }
        printf("%d\n",MAX);

    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章