1088滑雪

跟hdu的那道老鼠吃东西的很像,但是,所不同的是,这道题的起点没有预先跟你说,我一开始用了整个数组的最大值作为起始点,错了,后来发现如果这个数组中有很多相同的最大值的话,运行起来就会错,所以我干脆全部搜索,每个数值都有成为起点的机会——ACCEPT

#include "iostream"
#include "string.h"
using namespace std;
int p[4][2]={{1,0},{0,-1},{-1,0},{0,1}};
int num[110][110],mark[110][110],maxb=0,n,m;
int dfs(int x,int y){
  int max=0,i;
  if(mark[x][y]==1){
    for(i=0;i<4;i++){
      int xx=x+p[i][0];
      int yy=y+p[i][1];

      if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&num[x][y]>num[xx][yy]){
        //cout<<"xx "<<xx<<" yy "<<yy<<" num "<<num[xx][yy]<<endl;
        int ans=dfs(xx,yy);
        max=max>ans?max:ans;
      }
   }
   mark[x][y]=max+1;
  }
  //cout<<"maxb "<<maxb<<endl;
  maxb=maxb>mark[x][y]?maxb:mark[x][y];
  return mark[x][y];
}
int main(){
  int i,j,x,y,data=0;
  cin>>n>>m;
  for(i=1;i<=n;i++){
    for(j=1;j<=m;j++){
        cin>>num[i][j];
        mark[i][j]=1;
        if(data<num[i][j]){
           data=num[i][j];x=i;y=j;
        }
    }
  }
  //cout<<"x "<<x<<" y "<<y<<endl;
  //cout<<mark[x][y]<<endl;
  for(i=1;i<=n;i++)
    for(j=1;j<=m;j++)dfs(i,j);
  cout<<maxb<<endl;
}

 

posted @ 2013-08-22 18:28  龙城星  阅读(189)  评论(0编辑  收藏  举报