这题我的第一感觉就是用DFS。自己写的貌似不够完美,因为我看见别人的时间都特别的短,而我的有点长。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
using namespace std;
const int N=102;
int height[N][N];
bool visited[N][N];
int dx[]={1,0,-1,0};
int dy[]={0,1,0,-1};
int m,n,m_len;
bool judge(int x,int y)
{
if(visited[x][y])
return false;
return (x>=1&&x<=n)&&(y>=1&&y<=m);
}
bool isdec(int x,int y)
{
for(int i=0;i<4;i++)
{
int a=x+dx[i];
int b=y+dy[i];
if(judge(a,b)&&height[a][b]<height[x][y])
return true;
}
return false;
}
void dfs(int x,int y,int len)
{
if(!isdec(x,y))
{
if(m_len<len)
m_len=len;
return;
}
for(int i=0;i<4;i++)
{
int a=x+dx[i];
int b=y+dy[i];
if(height[a][b]>=height[x][y])
continue;
if(judge(a,b))
{
visited[a][b]=true;
dfs(a,b,len+1);
visited[a][b]=false;
}
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
char s[40];
scanf("%s%d%d",s,&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&height[i][j]);
int ans=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
memset(visited,false,sizeof(visited));
m_len=0;
dfs(i,j,1);
if(ans<m_len)
ans=m_len;
}
}
printf("%s: %d\n",s,ans);
}
return 0;
}