矩形滑雪场(深度搜索)

trs喜欢滑雪。他来到了一个滑雪场,这个滑雪场是一个矩形,为了简便,我们用r行c列的矩阵来表示每块地形。为了得到更快的速度,滑行的路线必须向下倾斜。         例如样例中的那个矩形,可以从某个点滑向上下左右四个相邻的点之一。例如24-17-16-1,其实25-24-23…3-2-1更长,事实上这是最长的一条。

输入格式:

第1行:  两个数字r,c(1< =r,c< =100),表示矩阵的行列。 第2..r+1行:每行c个数,表示这个矩阵。

输出格式:

仅一行:  输出1个整数,表示可以滑行的最大长度。


样例输入
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
样例输出
25


http://blog.csdn.net/u012629369/article/details/16888309?locationNum=10&fps=1


#include<iostream>

#include<cmath>
using namespace std;
int h[100][100],l[100][100]={0},dir[4][2]={{-1,0},{1,0},{0,1},{0,-1}};//代表上下左右四个方向 
int n,m,maxx=0;
int dfs(int i,int j)
{
   
if(l[i][j]!=0) return l[i][j];//为了避免重复搜索使耗时增加  如果不设置l数组也可以 
int len=1,ti,tj;
for(int k=0;k<4;k++)//检查上下左右是否有可以走的 ,,,,如果全不能走则dfs(i,j)=len=1; 
{
ti=i+dir[k][0];
tj=j+dir[k][1];
if(ti>=0&&ti<n&&tj>=0&&tj<m&&h[ti][tj]<h[i][j])
len=max(dfs(ti,tj)+1,len);
}
l[i][j]=len;
return l[i][j];
}
int main()
{
cin>>n>>m;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
cin>>h[i][j];
for(int i=0;i<n;i++)              
        {  
            for(int j=0;j<m;j++)  
            {  
                maxx=max(maxx,dfs(i,j));
            }  
        }  
        cout<<maxx<<endl;






不用方向数组如下



#include<iostream>
#include<cmath>
using namespace std;
int h[100][100],l[100][100]={0};
int n,m,maxx=0;
int dfs(int i,int j)
{
   
if(l[i][j]!=0) return l[i][j];//为了避免重复搜索使耗时增加  如果不设置l数组也可以 
int len=1;
if(i>=0&&i<n&&j-1>=0&&j-1<m&&h[i][j-1]<h[i][j])
len=max(len,dfs(i,j-1)+1);
if(i>=0&&i<n&&j+1>=0&&j+1<m&&h[i][j+1]<h[i][j])
len=max(len,dfs(i,j+1)+1);
if(i-1>=0&&i-1<n&&j>=0&&j<m&&h[i-1][j]<h[i][j])
len=max(len,dfs(i-1,j)+1);
if(i+1>=0&&i+1<n&&j>=0&&j<m&&h[i+1][j]<h[i][j])
len=max(len,dfs(i+1,j)+1);
l[i][j]=len;
return l[i][j];
}
int main()
{
cin>>n>>m;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
cin>>h[i][j];
for(int i=0;i<n;i++)              
        {  
            for(int j=0;j<m;j++)  
            {  
                maxx=max(maxx,dfs(i,j));
            }  
        }  
        cout<<maxx<<endl;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值