記憶搜尋解救滑雪問題

weixin_30788239發表於2020-04-05

/**
* use memory search to solve ski problem
* copyright: wuzhimu
* date: 2012.3.10
*/


#include <stdio.h>

int m,n;

/* *
* storage the point whether cross or not
* and storage cross the point max lenth
*/
struct point
{
bool cross;
int maxPath;
};

// storage point 's location
struct direction
{
int x;
int y;
};

struct point result[100][100];

//storage every point's height
int high[100][100];

//up,down,left and down direction's coordinate
struct direction temp[4]={{0,-1},{0,1},{-1,0},{1,0}};

 

int dfsAndMemorySearch(int row,int col)
{
int i=0;
int xTemp=0,yTemp=0,max=0;
for(;i<4;i++)
{
xTemp=col+temp[i].x;
yTemp=row+temp[i].y;
if(xTemp<0||xTemp>=n||yTemp<0||yTemp>=m)
//over the boundary
{
continue;
}
if(high[row][col]>=high[yTemp][xTemp])
//current point's high is not small than next point's
{
continue;
}
if(result[yTemp][xTemp].cross==false ||\
result[row][col].maxPath+1>result[yTemp][xTemp].maxPath)
{
max=dfsAndMemorySearch(yTemp,xTemp)+1;
result[row][col].maxPath=max>result[row][col].maxPath?max:result[row][col].maxPath;
}

}
return result[row][col].maxPath;
}

// get max path
int getMaxPath(int row,int col)
{
int i = 0 ,j = 0 ,max = 0,temp=0;
for( ; i<row ; i++ )
{
for( j=0; j<col ;j++ )
{
temp=dfsAndMemorySearch(i,j);
max=temp>max?temp:max;
}
}
return max;

}

int main()
{
int i=0,j=0;
freopen("input.txt","r",stdin);
scanf("%d %d ",&m,&n);
for(;i<m;i++)
{
for(j=0;j<n;j++)
{
scanf("%d ",&high[i][j]);
}
}
printf("%d\n",getMaxPath(m,n)+1);
return 0;
}

轉載於:https://www.cnblogs.com/jim-wu/archive/2012/03/10/2389660.html

相關文章