一道关于深度优先搜索的面试题

一道关于深度优先搜索的面试题

题目

给你一张黑白图片,像素点有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;
}

posted @ 2020-10-09 16:53  韩天尊  阅读(156)  评论(0)    收藏  举报