《劍指offer》:[66]矩陣中的路徑
題目:請設計一個函式,用來判斷在一個矩陣中是否存在一條包含某字串所有字元的路徑。路徑可以從矩陣中任意一格開始,每一步可以在矩陣中間向左、右、上、下移動一格。如果一條路徑經過了矩陣的某一格,那麼該路徑不能再次進入該格子。
解決方案:主要是用回溯法。首先任意選一個入口地址,也就是任選一個格子,如果格子中的字元ch和字串中的第一個字元相等,則字串向前移動一位,而在格子裡我們在允許的條件下(col<cols && row<rows邊界條件)可以向上下左右四個方向進行探索,比較,如果相等則繼續向前;如果不等,則回溯到上一個結點的位置。重複這個過程知道找到一條路徑包含目標字串,否則沒有該路徑。
具體實現程式碼如下:
具體是例如下圖:
解決方案:主要是用回溯法。首先任意選一個入口地址,也就是任選一個格子,如果格子中的字元ch和字串中的第一個字元相等,則字串向前移動一位,而在格子裡我們在允許的條件下(col<cols && row<rows邊界條件)可以向上下左右四個方向進行探索,比較,如果相等則繼續向前;如果不等,則回溯到上一個結點的位置。重複這個過程知道找到一條路徑包含目標字串,否則沒有該路徑。
具體實現程式碼如下:
#include <iostream>
using namespace std;
char arr[17]="abcesfcsadeekong";
char strr[6]="bcced";
bool HasPathHelp(char array[],int col,int row,int cols,int rows, char *str,int &pathlength,bool *visited )
{
if(str[pathlength]=='\0')
return true;
bool haspath=false;
if(row>=0 && row<rows && col >=0 && col <cols
&& array[row*cols+col]==str[pathlength]
&& !visited[row*cols+col])
{
++pathlength;
visited[row*cols+col]=true;
haspath=HasPathHelp(array,col-1,row,cols,rows,str,pathlength,visited) //left
|| HasPathHelp(array,col,row-1,cols,rows,str,pathlength,visited) //up
|| HasPathHelp(array,col+1,row,cols,rows,str,pathlength,visited) //right
|| HasPathHelp(array,col,row+1,cols,rows,str,pathlength,visited); //down
if(!haspath)
{
--pathlength;
visited[row*cols+col]=false;
}
}
return haspath;
}
bool HasPath(char array[],int rows, int cols,char *str)
{
if(array==NULL || rows<1 || cols<1 || str==NULL)
return false;
bool *visited=new bool[rows*cols];
memset(visited,0,rows*cols);
int pathlength=0;
for(int row=0;row<rows;row++)
{
for(int col=0;col<cols;col++)
{
if(HasPathHelp(array,col,row,cols,rows,str,pathlength,visited))
return true;
}
}
delete []visited;
return false;
}
int main()
{
bool result=HasPath(arr,4,4,strr);
if(result)
cout<<"該矩陣"<<arr<<"包含"<<strr<<"字串"<<endl;
else
cout<<"該矩陣"<<arr<<"不包含"<<strr<<"字串"<<endl;
system("pause");
return 0;
}
執行結果:
相關文章
- 劍指offer:JZ12 矩陣中的路徑矩陣
- 劍指 Offer 12-矩陣中的路徑c++矩陣C++
- 力扣 - 劍指 Offer 12. 矩陣中的路徑力扣矩陣
- 用 Go 劍指 Offer 12. 矩陣中的路徑 (DFS + 回溯)Go矩陣
- 劍指offer面試題12:矩陣中的路徑(Java版已在牛客網AC)面試題矩陣Java
- 【劍指offer】順時針列印矩陣矩陣
- 劍指offer-19:順時針列印矩陣矩陣
- 力扣 - 劍指 Offer 66. 構建乘積陣列力扣陣列
- 【劍指offer】陣列中的逆序對陣列
- 矩陣中的路徑矩陣
- 劍指offer面試題29:順時針列印矩陣面試題矩陣
- 劍指 Offer 29-順時針列印矩陣c++矩陣C++
- 力扣 - 劍指 Offer 29. 順時針列印矩陣力扣矩陣
- 【劍指offer】二維陣列中的查詢陣列
- 劍指Offer-37-陣列中逆序對陣列
- 劍指 offer(1) -- 陣列篇陣列
- 劍指Offer--陣列中重複的數字陣列
- 劍指offer——陣列中的逆序對C++(75%)陣列C++
- 【劍指offer】【1】二維陣列中的查詢陣列
- 《劍指offer》:[51]陣列中的重複數字陣列
- 二維陣列中的查詢——牛客劍指offer陣列
- 劍指Offer-連續子陣列中的最大和陣列
- 劍指 Offer 04. 二維陣列中的查詢陣列
- 【劍指offer】二叉樹中和為某一值的路徑二叉樹
- 【劍指offer】把陣列排成最小的數陣列
- 劍指offer之順序列印陣列陣列
- 【劍指offer】調整陣列順序陣列
- JZ-065-矩陣中的路徑矩陣
- 劍指 offer 第一題: 二維陣列中的查詢陣列
- 1. 二位陣列中的查詢(劍指offer)陣列
- 劍指offer:旋轉陣列的最小數字陣列
- 劍指offer 旋轉陣列的最小數字陣列
- 【劍指offer】連續子陣列的最大和陣列
- 【劍指offer】旋轉陣列的最小值陣列
- 【劍指offer】替換字串中的空格字串
- 《劍指offer》:[52]構建乘積陣列陣列
- 劍指offer 陣列中只出現一次的數字陣列
- 劍指 Offer 34. 二叉樹中和為某一值的路徑二叉樹