一道关于深度优先搜索的面试题
一道关于深度优先搜索的面试题
题目
给你一张黑白图片,像素点有0,1,两种值,求像素点值为1的点连起来的最长长度?
PS:当时回答很跪,但是做到剑指 Offer 12. 矩阵中的路径这一题时,得到了启发,根据如下大佬的详细题解,想出来了答案
代码
#include <iostream>
#include <vector>
#include <string>
#include <cstdio>
//scanf printf防止超时
#include <algorithm>
//vector的sort
#include <sstream>
//转换
using namespace std;
#include<iomanip>
//精度
#include<cmath>
//round四舍五入取整
#include <map>
#include <stack>
class Solution {
public:
int max;
int exist(vector<vector<int> >& board) {
max=0;
for(int i=0;i<board.size();i++)
{
for(int j=0;j<board[0].size();j++)
{
dfs(board,i,j,0);
}
}
return max;
}
bool dfs(vector<vector<int> >& board,int i,int j,int k)
{
if(i>=board.size()||i<0||j>=board[0].size()||j<0||board[i][j]==0)
return false;
//cout<<"k "<<k<<endl;
if(k+1>max)
max=k+1;
board[i][j]=0;
bool res=dfs(board,i-1,j,k+1)||dfs(board,i+1,j,k+1)||dfs(board,i,j-1,k+1)||dfs(board,i,j+1,k+1);
board[i][j]=1;
return res;
}
};
int main()
{
int n[5][5]={{0,0,1,1,0},
{0,0,0,0,0},
{0,0,1,1,0},
{0,0,1,1,1},
{0,0,0,0,0}};
vector<vector<int> > board;
for(int i=0;i<5;i++)
{
vector<int> temp;
for(int j=0;j<5;j++)
{
temp.push_back(n[i][j]);
}
board.push_back(temp);
}
Solution solve;
int res=solve.exist(board);
cout<<res<<endl;
return 0;
}