新农上路
- 积分
- 99
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2015-3-21
- 最后登录
- 1970-1-1
|
问个很弱的问题。LZ的第一道题,我的思路和LZ基本一致,对给的每一个点BFS,然后最终扫描。写了一下code发现个问题:比如,对第一个点BFS的时候,要记录矩阵里的点是否visited,不必重复visit;然后对第二个点BFS,又需要重新记录一下visited,以此类推,每个点都需要记录一下visited,最终把所有的visited都统计起来,看哪个点highest。貌似很麻烦,有没有更简单的方法?(我写的code贴在下面,发现暴麻烦,汗啊,各位高手多多批评指教)
int highestpoint( vector<vector<int>> &vv, vector<vector<int>> &pts ){
if(vv.empty() || vv[0].empty())
return -1;
vector<vector<int>> visited(vv.size()), visitall(vv.size());
for(int i=0;i<visited.size();i++){
vector<int> tmp(vv[0].size()); visited[i]=tmp; visitall[i]=tmp;
}
print_vv<T>(vv);
for(int i=0;i<pts.size();i++){
int pti=pts[i][0], ptj=pts[i][1];
BFSpoints<T>(vv,visited,pti,ptj);
for(int ii=0;ii<visited.size();ii++){
for(int jj=0;jj<visited[0].size();jj++){
visitall[ii][jj]+=visited[ii][jj]; visited[ii][jj]=0;
}
}
}
int max=-1;
for(int i=0;i<visitall.size();i++){
for(int j=0;j<visitall[0].size();j++){
if(visitall[i][j]==pts.size()){
if(vv[i][j]>max)
max=vv[i][j];
}
}
}
//BFSpoints<T>(vv,visited,1,3);
print_vv<T>(visitall);
return max;
};
void BFSpoints(vector<vector<int>> &vv, vector<vector<int>> &visited,
int pti, int ptj){
if(pti>=vv.size() || ptj>=vv[0].size())
return;
queue<vector<int>> qTmp;
vector<int> vtmp; vtmp.push_back(pti); vtmp.push_back(ptj);
qTmp.push(vtmp);
while(!qTmp.empty()){
vector<int> tmp=qTmp.front(); qTmp.pop();
visited[tmp[0]][tmp[1]]=1;
// down
if( tmp[0]<vv.size() && tmp[0]+1<vv.size()
&& vv[tmp[0]][tmp[1]]<vv[tmp[0]+1][tmp[1]]
&& visited[tmp[0]+1][tmp[1]]!=1 ){
vector<int> vtmp; vtmp.push_back(tmp[0]+1); vtmp.push_back(tmp[1]);
qTmp.push(vtmp);
}
// up
if( tmp[0]<vv.size() && tmp[0]-1>=0
&& vv[tmp[0]][tmp[1]]<vv[tmp[0]-1][tmp[1]]
&& visited[tmp[0]-1][tmp[1]]!=1 ){
vector<int> vtmp; vtmp.push_back(tmp[0]-1); vtmp.push_back(tmp[1]);
qTmp.push(vtmp);
}
// left
if( tmp[1]>=0 && tmp[1]-1>=0
&& vv[tmp[0]][tmp[1]]<vv[tmp[0]][tmp[1]-1]
&& visited[tmp[0]][tmp[1]-1]!=1 ){
vector<int> vtmp; vtmp.push_back(tmp[0]); vtmp.push_back(tmp[1]-1);
qTmp.push(vtmp);
}
// right
if( tmp[1]<vv[0].size() && tmp[1]+1<vv[0].size()
&& vv[tmp[0]][tmp[1]]<vv[tmp[0]][tmp[1]+1]
&& visited[tmp[0]][tmp[1]+1]!=1 ){
vector<int> vtmp; vtmp.push_back(tmp[0]); vtmp.push_back(tmp[1]+1);
qTmp.push(vtmp);
}
}
};
|
|