题目;http://poj.org/problem?id=1088
感觉对深搜还不太熟练,所以练习一下,类似于连连看的那题,注意的是所求的是最大达长度,并不是从最大的或者最小的点出发得到的就是最长的路径
1 #include<iostream> 2 using namespace std; 3 int dx[]={0,0,1,-1}; 4 int dy[]={1,-1,0,0}; 5 int n,m,dis[105][105]; 6 int vis[105][105]; 7 void dfs(int x,int y) 8 { 9 for (int i=0;i<4;i++) 10 { 11 int sx=x+dx[i]; 12 int sy=y+dy[i]; 13 if (sx<1||sx>n||sy<1||sy>m) continue; 14 if (dis[sx][sy]<=dis[x][y]) continue; 15 if (vis[sx][sy]>=vis[x][y]+1) continue; 16 vis[sx][sy]=vis[x][y]+1; 17 dfs(sx,sy); 18 } 19 } 20 int main() 21 { 22 int i,j; 23 cin>>n>>m; 24 for (i=1;i<=n;i++){ 25 for(j=1;j<=m;j++){ 26 cin>>dis[i][j]; 27 vis[i][j]=1; 28 } 29 } 30 for (i=1;i<=n;i++) 31 for (j=1;j<=m;j++) 32 dfs(i,j); 33 int mx=0; 34 for (i=1;i<=n;i++) 35 for (j=1;j<=m;j++) 36 if (mx<vis[i][j]) mx=vis[i][j]; 37 cout<<mx<<endl; 38 return 0; 39 }
差不多
1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 int dx[5]={1,-1,0,0}; 5 int dy[5]={0,0,-1,1}; 6 int n,m,vis[101][101]; 7 int hei[101][101]; 8 int dfs(int x,int y) 9 { 10 if (vis[x][y]) return vis[x][y]; 11 int ans=0; 12 for (int i=0;i<4;i++) 13 { 14 int sx=x+dx[i]; 15 int sy=y+dy[i]; 16 if (sx<1||sx>n||sy<1||sy>m) continue; 17 if (hei[sx][sy]>=hei[x][y]) continue; 18 vis[sx][sy]=dfs(sx,sy); 19 if (ans<vis[sx][sy]) 20 ans=vis[sx][sy]; 21 } 22 if (ans) return ans+1; 23 return 1; 24 } 25 int main() 26 { 27 int i,j,x,y; 28 scanf("%d %d",&n,&m); 29 int mn=100005; 30 for (i=1;i<=n;i++) 31 { 32 for (j=1;j<=m;j++) 33 { 34 scanf("%d",&hei[i][j]); 35 if (hei[i][j]<mn) 36 { 37 x=i,y=j; 38 mn=hei[i][j]; 39 } 40 } 41 } 42 memset(vis,0,sizeof(vis)); 43 vis[x][y]=1; 44 for (i=1;i<=n;i++) 45 for (j=1;j<=m;j++) 46 vis[i][j]=dfs(i,j); 47 int mx=0; 48 for (i=1;i<=n;i++) 49 for (j=1;j<=m;j++) 50 if (mx<vis[i][j]) mx=vis[i][j]; 51 printf("%d\n",mx); 52 return 0; 53 }