深度优先之货物搬运路径
这是阿里的一道编程测试题, 找工作经常考察深度优先,阿里的这个测试题应该不算偏,是个基本的题目:
题目描述
给定一个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;
}