下山 | ||||||
| ||||||
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);
}
}