比赛 20120712 评测结果 AAAWWAAAAA
题目名称 登山 最终得分 80
用户昵称 Citron酱 运行时间 0.066 s
代码语言 C++ 内存使用 0.31 MiB
提交时间 2012-07-12 10:10:58
显示代码纯文本
#include <cstdio>

#define I_F "hike.in"
#define O_F "hike.out"

const short MAXn=60;
const short R[4][2]={{0,1},{1,0},{0,-1},{-1,0}};

long map[MAXn][MAXn];
bool fl[MAXn][MAXn]={{false}};
bool flag=true;
short n, m;
int ans=0;

void Input();
void Dfs(const short&, const short&, const int&, const long&);
void Output();

int main()
{
	Input();
	for (short i=0; i<n; ++i)
		for (short j=0; j<n; ++j)
			Dfs(i,j,1,1);
	Output();
	return 0;
}

void Input()
{
	freopen(I_F,"r",stdin);
	scanf("%hd%hd",&n,&m);
	for (short i=0; i<n; ++i)
		for (short j=0; j<n; ++j)
			scanf("%ld",&map[i][j]);
}

void Dfs(const short &x, const short &y, const int &l, const long &f)
{
	fl[x][y]=true;
	if (l>ans)
		ans=l;
	int a, b;
	short c;
	for (short i=0; i<4; ++i)
	{
		a=x+R[i][0], b=y+R[i][1];
		c=(map[a][b]-map[x][y]>0)?1:-1;
		if (a>=0 && a<n && b>=0 && b<n && (!fl[a][b]) && ((flag && l>1) || c*f>=0) && map[x][y]!=map[a][b])
		{
			if (c*f<0)
				flag=false;
			Dfs(a,b,l+1,c);
			if (c*f<0)
				flag=true;
		}
	}
	fl[x][y]=false;
}

void Output()
{
	freopen(O_F,"w",stdout);
	printf("%d\n",ans);
}