一道關於深度優先搜尋的面試題
阿新 • • 發佈:2020-10-09
一道關於深度優先搜尋的面試題
題目
給你一張黑白圖片,畫素點有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; }