梦,才是最真的现实

导航

记忆化搜索,poj1088

flag【i】【j】表示以现在这个位置为起点的最远能走的长度,熟悉下递归,这个题应该不难,记忆化



#include<stdio.h>
#include<string.h>
#define Max 105
#define Maxhigh 10005
typedef struct 
{
	int x,y;
}position;
position move[4]={-1,0,0,1,1,0,0,-1};
int flag[Max][Max];
int maze[Max][Max];
void wall(int r,int c);
int dfs(int i,int j);
int main()
{
	int r,c,i,j,max;
	while(scanf("%d %d",&r,&c)!=EOF)
	{
		max=0;
		memset(flag,0,sizeof(flag));
		for(i=1;i<=r;i++)
			for(j=1;j<=c;j++)
				scanf("%d",&maze[i][j]);
		wall(r,c);
		for(i=1;i<=r;i++)
			for(j=1;j<=c;j++)
				flag[i][j]=dfs(i,j);
		for(i=1;i<=r;i++)
			for(j=1;j<=c;j++)
				if(flag[i][j]>max)
					max=flag[i][j];
		printf("%d\n",max);
	}
	return 0;
}
void wall(int r,int c)
{
	int i;
	for(i=0;i<=r+1;i++)
	{
		maze[i][0]=Maxhigh;
		maze[i][c+1]=Maxhigh;
	}
	for(i=0;i<=c+1;i++)
	{
		maze[0][i]=Maxhigh;
		maze[r+1][i]=Maxhigh;
	}
}
int dfs(int a,int b)
{
	if(flag[a][b]) return flag[a][b];
	position next;
	int i,max=0,k;
	for(i=0;i<4;i++)
	{
		next.x=a+move[i].x;
		next.y=b+move[i].y;
		if(maze[next.x][next.y]<maze[a][b])
		{
			k=dfs(next.x,next.y);
			if(k>max)
				max=k;
		}
	}
	flag[a][b]=max+1;
	return max+1;
}


posted on 2012-05-22 22:58  梦,才是最真的现实  阅读(130)  评论(0编辑  收藏  举报