POJ1062 昂贵的聘礼
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
一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小。在上面的例子中,一条可滑行的滑坡为24-17-16-1。当然25-24-23-…-3-2-1更长。事实上,这是最长的一条。
输入的第一行表示区域的行数R和列数C(1 <= R,C <= 100)。下面是R行,每行有C个整数,代表高度h,0<=h<=10000。
输出最长区域的长度。
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
这道题是一道典型的dfs,所以直接放出代码。
关键的dfs部分:
void dfs(int x,int y,int res){
if(res>ans) ans = res;
if(x>=r||y>=c||x<0||y<0) return;
if(step[x][y]>=res) return;
else step[x][y] = res;
if(x-1>=0&&h[x-1][y]<h[x][y])
{
res ++;
dfs(x-1,y,res);
res--;
}
if(x+1<r&&h[x+1][y]<h[x][y])
{
res++;
dfs(x+1,y,res);
res--;
}
if(y-1>=0&&h[x][y-1]<h[x][y])
{
res++;
dfs(x,y-1,res);
res--;
}
if(y+1<c&&h[x][y+1]<h[x][y])
{
res++;
dfs(x,y+1,res);
res--;
}
}
完整代码:
#include
#include
#include
#include
using namespace std;
int r,c,h[105][105],step[105][105];
int a[4][2]={
{
1,0},{
0,1},{
-1,0},{
0,-1}};
int ans;
void dfs(int x,int y,int res){
if(res>ans) ans = res;
if(x>=r||y>=c||x<0||y<0) return;
if(step[x][y]>=res) return;
else step[x][y] = res;
if(x-1>=0&&h[x-1][y]<h[x][y])
{
res ++;
dfs(x-1,y,res);
res--;
}
if(x+1<r&&h[x+1][y]<h[x][y])
{
res++;
dfs(x+1,y,res);
res--;
}
if(y-1>=0&&h[x][y-1]<h[x][y])
{
res++;
dfs(x,y-1,res);
res--;
}
if(y+1<c&&h[x][y+1]<h[x][y])
{
res++;
dfs(x,y+1,res);
res--;
}
}
int main(){
scanf("%d%d",&r,&c);
memset(step,0,sizeof(step));
for(int i=0;i<r;++i)
for(int j=0;j<c;++j)
scanf("%d",&h[i][j]);
int mas = 0,inx,iny;
ans = 0;
for(int i=0;i<r;++i){
mas = 0;
for(int j=0;j<c;++j){
if(h[i][j]>mas){
inx = i;
iny = j;
mas = h[i][j];
}
}
dfs(inx,iny,1);
}
cout<<ans<<endl;
return 0;
}