深度优先之货物搬运路径

这是阿里的一道编程测试题, 找工作经常考察深度优先,阿里的这个测试题应该不算偏,是个基本的题目:

题目描述

给定一个mxn货架,标注重量,例如:
2 3 4 6 7 1
9 8 7 11 12 14
21 22 32 45 16 10

搬运员搬运时候有个习惯,每次搬运的时候都会比上一个货物要轻.每次搬运一个货物奖励1元,
按照这个原则球搬运员的最大收益.

题目分析

很显然是深度优先的题目,现在还没想到优化的方法,先按照最基本的,从每一个货物出发找出最长的路径,求这其中最大的.希望以后能够探索出更加优质的程序结构.

代码


#include<iostream>
#include<vector>
using namespace std;

bool test(vector<vector<int> > & thgs, int i , int j){
     if(i < thgs.size()&&i>=0&&j>=0 && j < thgs[0].size() && thgs[i][j]>0 )
        return true;
     return false;
}


//深度优先
int epath(vector<vector<int> >  &thgs, int i , int j){
    int maxpp = 0, res = 0; 
    int  delt[4][2] = {0,1,0,-1,1,0,-1,0};
    for(int ii =0 ; ii < 4; ii++){
	    if(test(thgs,i+delt[ii][0],j + delt[ii][1])&&thgs[i+delt[ii][0]][j+ delt[ii][1]]< thgs[i][j]){
		   int tp = thgs[i][j];
		   thgs[i][j]=-1;
		   res = epath(thgs , i+delt[ii][0] ,j + delt[ii][1])+1;
		   maxpp = maxpp < res ? res : maxpp;
		   thgs[i][j]=tp;
	    }
   }
    return  maxpp; 
}

int main(){


// 构造输入
  int m ,  n ;
  cin >>m >> n;
  vector<vector<int> > things;

for(int i =0 ;  i < m ; i++)
{
    vector<int>  temp;
    for(int j =0 ; j< n ; j++)
    {
          int tt; cin >>tt;
          temp.push_back(tt);
    }
    things.push_back(temp); 
}
// 从不同的货物出发
int maxpp = 0;
for(int i =0 ; i < m ; i++)
{ 
   for(int j =0 ; j< n ; j++)
   {
      int res = epath(things, i ,j)+1;
      maxpp = maxpp > res? maxpp:res;
   }
}
  cout << maxpp;
}




posted @ 2017-07-30 22:06  bzt007  阅读(203)  评论(0编辑  收藏  举报