如题。
感觉思路就是搜索,但是不知道为啥,就是一直爬不出来……
代码:
#include<bits/stdc++.h>
#define ns "-1"
#define fs(i,x,y,z) for(ll i=x;i<=y;i+=z)
#define ft(i,x,y,z) for(ll i=x;i>=y;i+=z)
#define ll long long
#define ull unsigned long long
using namespace std;
const int rw[]={-1,0,1,0,-1,1,-1,1},cl[]={0,1,0,-1,-1,1,1,-1};
const int N=1001,inf=0x3f3f3f3f;
inline int read(){
int date=0,w=1;char c=0;
while(c<'0'||c>'9'){if(c=='-')w=-1;c=getchar();}
while(c>='0'&&c<='9'){date=date*10+c-'0';c=getchar();}
return date*w;
}
int n,a[N][N],ans,m,psyc,fans,p;
bool ison;//0上1下
void dfs(int i,int j,int got){//i目前x,j 目前y,got这是第几块
if(i<1||j<1||i>n||j>m) return;
if(got>=p){//ok,到了
ans=max(ans,got);
fans=1;
return;
}//如果got正好到了psyc,那么转变
if(got==psyc) ison=1;
fs(k,0,3,1){
int tx=i+rw[k],ty=j+cl[k];
if(a[tx][ty]<a[i][j]&&ison) dfs(tx,ty,got+1);
if(a[tx][ty]>a[i][j]&&ison==0) dfs(tx,ty,got+1);
}
}
int main(){
n=read(),m=read();
fs(i,1,n,1){
fs(j,1,m,1){
a[i][j]=read();
}
}
fs(s,3,n*m,1){//要走多少块
p=s;
fs(f,2,s-1,1){//第几块是最高点
psyc=f;
fs(i,1,n,1){
fs(j,1,m,1){
ison=0;
dfs(i,j,1);
}
}
}
}
printf("%d",ans-1);
return 0;
}