本题源自剑指offer
--------------------------------------------------------
回溯法遍历矩阵。
代码:
bool hasPath(char* matrix, int rows, int cols, char* str)
{
if(matrix==NULL || rows<=0 || cols<=0 || str==NULL)
return true;
//保存路径是否被访问过
bool *visited=new bool[rows*cols];
memset(visited,0,rows*cols);
int lengthPath=0;
for(int i=0;i<rows;i++){
for(int j=0;j<cols;j++){
if(hasPathCore(matrix,rows,cols,i,j,str,visited,lengthPath)){
return true;
}
}
}
delete[] visited;
return false;
}
bool hasPathCore(char *matrix,int rows,int cols,int row,int col,char* str,bool* visited,int &lengthPath){
if(str[lengthPath]=='\0')
return true;
bool hasPath=false;
if(row>=0&&row<rows&&col>=0&&col<cols&&str[lengthPath]==matrix[row*cols+col]&&!visited[col+cols*row]){
visited[row*cols+col]=true;
++lengthPath;
hasPath=hasPathCore(matrix,rows,cols,row-1,col,str,visited,lengthPath)||hasPathCore(matrix,rows,cols,row,col+1,str,visited,lengthPath)||hasPathCore(matrix,rows,cols,row+1,col,str,visited,lengthPath)||hasPathCore(matrix,rows,cols,row,col-1,str,visited,lengthPath);
if(!hasPath){
//回溯到上一个点。
lengthPath--;
visited[row*cols+col]=false;
}
}