標籤:

矩陣中的路徑(回溯法)

請設計一個函數,用來判斷在一個矩陣中是否存在一條包含某字元串所有字元的路徑。路徑可以從矩陣中的任意一個格子開始,每一步可以在矩陣中向左,向右,向上,向下移動一個格子。如果一條路徑經過了矩陣中的某一個格子,則該路徑不能再進入該格子。 例如 a b c e s f c s a d e e 矩陣中包含一條字元串"bcced"的路徑,但是矩陣中不包含"abcb"路徑,因為字元串的第一個字元b佔據了矩陣中的第一行第二個格子之後,路徑不能再次進入該格子。#include "stdafx.h"#include <stdio.h>#include <string>#include <stack>#include <stdio.h>#include <stddef.h>bool hasPathCore(char* matrix,int rows,int cols,int row,int col,char* str,int& pathLength,bool* visited){ if(str[pathLength]=="") return true; bool hasPath=false; if(row>=0 && row <rows && col >= 0 && col < cols && matrix[row*cols+col] == str[pathLength] && !visited[row*cols+col]) { ++pathLength; visited[row*cols+col]=true; hasPath=hasPathCore(matrix,rows,cols,row,col-1,str,pathLength,visited) ||hasPathCore(matrix,rows,cols,row-1,col,str,pathLength,visited) ||hasPathCore(matrix,rows,cols,row,col+1,str,pathLength,visited) ||hasPathCore(matrix,rows,cols,row+1,col,str,pathLength,visited); if(!hasPath){ --pathLength; visited[row*cols+col]=false; } }}bool hasPath(char* matrix, int rows, int cols, char* str) { if(matrix==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(hasPathCore(matrix,rows,cols,row,col,str,pathLength,visited)) { return true; } } } } void Test(char* testName, char* matrix, int rows, int cols, char* str, bool expected){ if(testName != NULL) printf("%s begins: ", testName); if(hasPath(matrix, rows, cols, str) == expected) printf("Passed.
"); else printf("FAILED.
");}//ABCE//SFCS//ADEE//ABCCEDvoid Test1(){ char matrix[] = "ABCESFCSADEE"; char* str = "ABCCED"; Test("Test1", (char*)matrix, 3, 4, str, true);}//ABCE//SFCS//ADEE//SEEvoid Test2(){ char matrix[] = "ABCESFCSADEE"; char* str = "SEE"; Test("Test2", (char*)matrix, 3, 4, str, true);}/*int main(int argc, char* argv[]){ Test1(); Test2(); getchar(); return 0;}*/

  • 推薦閱讀:

    矩陣(三)
    gal2mat:將gal權重文件轉成n-by-n矩陣
    74. Search a 2D Matrix
    矩陣和向量求導
    C++矩陣處理庫

    TAG:矩陣 |