试题描述:
LYH喜欢滑雪,因为滑雪的确很刺激,可是为了获得速度,滑的区域必须向下倾斜,当LYH滑到坡底,不得不再次走上坡或等着直升机来载他,LYH想知道在一个区域中最长的滑坡。滑坡的长度由滑过点的个数来计算,区域由一个二维数组给出,数组的每个数字代表点的高度。下面是一个例子:
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-17-16-1(从25开始到1结束),当然25-24……2…1更长,事实上这是最长的一条。
输入:
输入的第一行为表示区域的二维数组的行数R和列数C(1≤R、C≤100)下面是R行,每行有C个数代表高度。
输出:
输出区域中最长的滑坡长度。
输入示例:
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
运行时间限制:1000ms; 运行空间限制:51200KB; 代码长度限制:2000000B
#include<iostream> #include<cstdio> using namespace std; int dx[5]={0,-1,0,1,0}, dy[5]={0,0,1,0,-1}; long r,c,i,j,p,t,ans; long m[101][101],f[101][101]; int search(int,int); int main() { cin>>r>>c; ans=0; for(i=1;i<=r;i++) for(j=1;j<=c;j++) cin>>m[i][j]; for(i=1;i<=r;i++) for(j=1;j<=c;j++) { t=search(i,j); f[i][j]=t; if(t>ans)ans=t; } cout<<ans; } int search(int x,int y) { int i,t,tmp,nx,ny; if(f[x][y]>0) { return(f[x][y]); } t=1; for(i=1;i<=4;i++) { nx=x+dx[i]; ny=y+dy[i]; if((nx>=1)&&(nx<=r)&&(ny>=1)&&(ny<=c)&&(m[x][y]<m[nx][ny])) { tmp=search(nx,ny)+1; if(tmp>t)t=tmp; } } f[x][y]=t; return(t); }
一道搜索的试题。(递归也可以放在上面)
首先要注意的是,定义一个二维数组。
然后输入,用嵌套循环。
然后,进行dfs(代码中的search),
定义dx和dy,用于计算分别向上下左右四个方向。
但是我们只需要进行一次,所以就要判断一次
if(f[x][y]>0) { return(f[x][y]); }
随后我们就要继续进行dfs了,并在dfs的过程中判断最大值。