#include <iostream>
using namespace std;
void printMap(bool *visited, int rows, int cols) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
cout << visited[i*cols + j] << " ";
}
cout << endl;
}
}
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) //因为是一个一个地运行,所以用pathLength的引用没关系
|| 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)) {
printMap(visited, rows, cols);
return true;
}
}
}
delete[] visited;
return false;
}
int main() {
char matrix[3 * 4] = { 'a','b','t','g',
'c','f','c','s',
'j','d','e','h' };
bool b = hasPath(matrix, 3, 4, "acjdecs");
cout << b << endl;
system("pause");
return 0;
}
特点:可以以矩阵中的任意元素作为起点或终点。如果要改成走迷宫的话还要改一下。