欢聚时代笔试题
1.输入一个矩阵,从左上角走到右下角:向右、向下可以走, 向下优先,找出最短路径,需要输出走过的位置
#欢聚集团##笔试题目#
我用backtracking加剪枝只能通过40%,可能用动态规划更好,但不知道动态规划怎么保存路径,有大神做出来了吗,求教
#include <iostream>
#include <vector>
#include <algorithm>
vector<vector<int>> shared;
void backtracking(vector<vector<int>> &board,vector<vector<int>> &prune, int x, int y, int n, int m, int sum, int &res, vector<vector<int>> tra){
if(x<0||x>=m || y<0||y>=m)
return ;
if(sum>=res) return ;
if(x==n-1 && y==m-1){
if(sum<res){
res=sum;
shared=tra;
}
}
sum+=board[x][y];
if(sum>prune[x][y]) return;
else prune[x][y]=sum;
tra.push_back({x,y});
backtracking(board,prune,x+1,y,n,m,sum,res,tra);
backtracking(board,prune,x,y+1,n,m,sum,res,tra);
}
int main(){
int m,n;
cin>>n>>m;
vector<vector<int>> prune(n,vector<int>(m,INT_MAX));
vector<vector<int>> board(n,vector<int>(m,0));
for(int i=0;i<n; i++)
for(int j=0;j<m;j++)
cin>>board[i][j];
int res=INT_MAX;
vector<vector<int>> start;
backtracking(board,prune,0,0,n,m,0,res,start);
for(vector<vector<int>>::const_iterator vit=shared.begin();vit!=shared.end();vit++){
vector<int> tmp=*vit;
cout<<tmp[0]<<" "<<tmp[1]<<endl;
}
cout<<n-1<<" "<<m-1<<endl;
return 0;
} 
查看8道真题和解析