Michael喜欢滑雪。他来到了一个滑雪场,这个滑雪场是一个矩形,为了简便,我们用r行c列的矩阵来表示每块地形。为了得到更快的速度,滑行的路线必须向下倾斜。
例如样例中的那个矩形,可以从某个点滑向上下左右四个相邻的点之一。例如24-17-16-1,其实25-24-23…3-2-1更长,事实上这是最长的一条。
Input
输入文件 第1行: 两个数字r,c(1< =r,c< =100),表示矩阵的行列。
第2…r+1行:每行c个数,表示这个矩阵。
Output
输出文件 仅一行: 输出1个整数,表示可以滑行的最大长度。
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
这个是一个特殊样例(自己debug半天wa了很多次):
3 3
5 5 5
6 6 6
7 7 7
Output:
25
3
#include<bits/stdc++.h>
using namespace std;
int map1[101][101];
int way[4][2] = {{0,1},{0,-1},{1,0},{-1,0}};//位置转移
int dp[101][101];
int r,c,maxn;
void dfs(int x,int y){
int i,j,xx,yy;
if(dp[x][y]){//如果该点不是初始化的0点说明 该点已经经过了遍历
return ;
}
dp[x][y] = 1;
for(i = 0;i<4;i++){
xx = x + way[i][0];
yy = y + way[i][1];
if(xx<1||xx>r||yy<1||yy>c||map1[x][y]>=map1[xx][yy]){//判断边界 以及不符合规定地方
continue;
}
dfs(xx,yy); //更新新的点并再去搜索
dp[x][y] = max(dp[x][y],dp[xx][yy]+1); //该点的次数和与更新过后的次数和作比较+1是因为一开始还有本身的1
}
return ;
}
int main(){
int i,j;
while(cin>>r>>c){
memset(dp,0,sizeof(dp));
memset(map1,0,sizeof(map1));
for(i = 1;i<=r;i++){
for(j = 1;j<=c;j++){
scanf("%d",&map1[i][j]);
}
}
maxn = 0;
for(i = 1;i<=r;i++){
for(j = 1;j<=c;j++){
dfs(i,j);
maxn = max(maxn,dp[i][j]); //取滑的次数最多
}
}
printf("%d\n",maxn);
}
}