剑指Offer——面试题12:矩阵中的路径

面试题12:矩阵中的路径
题目:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用下划线标出)。但矩阵中不包含字符串“abfb”的路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入这个格子。
a b t g
c f c s
j d e h

#include <iostream>
#include <cstring>
using namespace std;
bool hasPathCore(const char* matrix, int rows, int cols, int row, int col, const char* str, int& pathLength, bool* visited){
	if(str[pathLength]=='\0') 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, col+1, str, pathLength, visited)
				|| hasPathCore(matrix, rows, cols, row-1, col, str, pathLength, visited)
				|| hasPathCore(matrix, rows, cols, row+1, col, str, pathLength, visited);
			
		if(!hasPath){
			pathLength--;
			visited[row+cols+col]=false;
		}
	}
	return hasPath;
} 

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;
		}
	}
	delete[] visited;
	return false;
}
int main() {
	char* matrix = "abtgcfcsjdeh";
	char* str = "bfce";
	printf("%d", hasPath(matrix, 3, 4, str));
	return 0;
}
发布了23 篇原创文章 · 获赞 24 · 访问量 575

猜你喜欢

转载自blog.csdn.net/qq_35340189/article/details/104372686