P - 滑雪
Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道载一个区域中最长底滑坡。区域由一个二维数组给出。数组的每个数字代表点的高度。下面是一个例子
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更长。事实上,这是最长的一条。
Input
输入的第一行表示区域的行数R和列数C(1 <= R,C <= 100)。下面是R行,每行有C个整数,代表高度h,0<=h<=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
P - 滑雪
Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道载一个区域中最长底滑坡。区域由一个二维数组给出。数组的每个数字代表点的高度。下面是一个例子
一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小。在上面的例子中,一条可滑行的滑坡为24-17-16-1。当然25-24-23-...-3-2-1更长。事实上,这是最长的一条。
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
第一种:用深搜
(1)
#include<stdio.h>
#include<string.h>
int xia[200][200];
int map[200][200];
int a,b,maxx,minn;
int go[4][2]= {0,1,0,-1,1,0,-1,0};
void dfs(int x1,int y1,int step)
{
if(maxx<=step)//更新最大的步数
maxx=step;
int i;
for(i=0; i<4; i++)
{
int xx=x1+go[i][0],yy=y1+go[i][1];
if(xx>=0&&xx<a&&yy>=0&&yy<b&&map[x1][y1]>map[xx][yy]&&xia[xx][yy]==0&&maxx-step<=map[xx][yy])//筛去比(较大步数-当前步数)还小的;
{
xia[xx][yy]=1;
dfs(xx,yy,step+1);
xia[xx][yy]=0;
}
}
}
int main()
{
int x3,y3;
while(~scanf("%d%d",&a,&b))
{
maxx=-1;
memset(map,0,sizeof(map));
memset(xia,0,sizeof(xia));
int i,j;
for(i=0; i<a; i++)
for(j=0; j<b; j++)
{
scanf("%d",&map[i][j]);
if(maxx<map[i][j])
{
maxx=map[i][j];
x3=i;
y3=j;
}
}
maxx=0;
xia[x3][y3]=1;
dfs(x3,y3,1);//找出较大的步数
for(i=0; i<a; i++)
for(j=0; j<b; j++)
if(map[i][j]>maxx)//筛去比较大步数小的数
{
memset(xia,0,sizeof(xia));
xia[i][j]=1;
dfs(i,j,1);
}
printf("%d\n",maxx);
}
return 0;
}
(2)
#include<stdio.h>
#include<string.h>
int xia[200][200];
int map[200][200];
int a,b,ans,minn;
int go[4][2]= {0,1,0,-1,1,0,-1,0};
void dfs(int x1,int y1,int step)
{
if(ans<=step)//更新步数
ans=step;
int i;
for(i=0; i<4; i++)
{
int xx=x1+go[i][0],yy=y1+go[i][1];
if(xx>=0&&xx<a&&yy>=0&&yy<b&&map[x1][y1]>map[xx][yy]&&xia[xx][yy]==0&&ans-step<=map[xx][yy]-minn)//筛去比(较大步数加上最小数再减去当前步数)还小的数
{
xia[xx][yy]=1;
dfs(xx,yy,step+1);
xia[xx][yy]=0;
}
}
}
int main()
{
int x3,y3,maxx;
while(~scanf("%d%d",&a,&b))
{
minn=10000000;
maxx=-1;
memset(map,0,sizeof(map));
memset(xia,0,sizeof(xia));
int i,j;
for(i=0; i<a; i++)
for(j=0; j<b; j++)
{
scanf("%d",&map[i][j]);
if(maxx<map[i][j])//最大的数
{
maxx=map[i][j];
x3=i;
y3=j;
}
if(minn>map[i][j])//最小的数
minn=map[i][j];
}
ans=0;
xia[x3][y3]=1;
dfs(x3,y3,1);//找出较大的步数
for(i=0; i<a; i++)
for(j=0; j<b; j++)
if(map[i][j]-minn>=ans)//筛去比(较大步数减去最小数)还小的数
{
memset(xia,0,sizeof(xia));
xia[i][j]=1;
dfs(i,j,1);
}
printf("%d\n",ans);
}
return 0;
}
第二种(动归目前还不会,稍后补)