1. 程式人生 > 實用技巧 >一道關於深度優先搜尋的面試題

一道關於深度優先搜尋的面試題

一道關於深度優先搜尋的面試題

題目

給你一張黑白圖片,畫素點有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;
}