题目:
判断一个矩阵中是否存在一条 包含某字符串所有字符的 路径。
路径可以从矩阵中任意一格开始,每一步可以向上下左右移动一格;
如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。
例如:
a b t g
c f c s
j d e h
包含字符串“bfce”,不包含“abfb”。
//#include<bits/stdc++.h>
#include<iostream>
#include<vector>
#include<string>
//#include<map>
//#include<algorithm>
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<rows&&row>=0&&col<cols&&col>=0
&&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+1, col, str, pathLength, visited)
|| hasPathCore(matrix, rows, cols, row, col + 1, str, pathLength, visited);
if (!hasPath)
{
--pathLength;
visited[row * cols + col] = false;
}
}
return hasPath;
}
bool hasPath(const char *matrix, int rows, int cols,const char* str)
{
bool* visited = new bool[rows * cols];
memset(visited, 0, rows * cols);
int pathLength = 0;
for (size_t row = 0; row < rows; row++)
{
for (size_t col = 0; col < cols; col++)
{
if (hasPathCore(matrix, rows, cols, row,col, str,pathLength,visited))
{
return true;
}
}
}
delete[]visited;
return false;
}
int main()
{
/*const char* matrix = "ABTGCFCSJDEH";
const char* str = "BFCE";*/
const char* matrix = "ABTGCFCSJDEH";
const char* str = "ABFB";
cout << hasPath(matrix, 3, 4, str) << endl;
return 0;
}
测试用例:
// ====================测试代码====================
void Test(const char* testName, const char* matrix, int rows, int cols, const char* str, bool expected)
{
if(testName != nullptr)
printf("%s begins: ", testName);
if(hasPath(matrix, rows, cols, str) == expected)
printf("Passed.\n");
else
printf("FAILED.\n");
}
//ABTG
//CFCS
//JDEH
//BFCE
void Test1()
{
const char* matrix = "ABTGCFCSJDEH";
const char* str = "BFCE";
Test("Test1", (const char*) matrix, 3, 4, str, true);
}
//ABCE
//SFCS
//ADEE
//SEE
void Test2()
{
const char* matrix = "ABCESFCSADEE";
const char* str = "SEE";
Test("Test2", (const char*) matrix, 3, 4, str, true);
}
//ABTG
//CFCS
//JDEH
//ABFB
void Test3()
{
const char* matrix = "ABTGCFCSJDEH";
const char* str = "ABFB";
Test("Test3", (const char*) matrix, 3, 4, str, false);
}
//ABCEHJIG
//SFCSLOPQ
//ADEEMNOE
//ADIDEJFM
//VCEIFGGS
//SLHECCEIDEJFGGFIE
void Test4()
{
const char* matrix = "ABCEHJIGSFCSLOPQADEEMNOEADIDEJFMVCEIFGGS";
const char* str = "SLHECCEIDEJFGGFIE";
Test("Test4", (const char*) matrix, 5, 8, str, true);
}
//ABCEHJIG
//SFCSLOPQ
//ADEEMNOE
//ADIDEJFM
//VCEIFGGS
//SGGFIECVAASABCEHJIGQEM
void Test5()
{
const char* matrix = "ABCEHJIGSFCSLOPQADEEMNOEADIDEJFMVCEIFGGS";
const char* str = "SGGFIECVAASABCEHJIGQEM";
Test("Test5", (const char*) matrix, 5, 8, str, true);
}
//ABCEHJIG
//SFCSLOPQ
//ADEEMNOE
//ADIDEJFM
//VCEIFGGS
//SGGFIECVAASABCEEJIGOEM
void Test6()
{
const char* matrix = "ABCEHJIGSFCSLOPQADEEMNOEADIDEJFMVCEIFGGS";
const char* str = "SGGFIECVAASABCEEJIGOEM";
Test("Test6", (const char*) matrix, 5, 8, str, false);
}
//ABCEHJIG
//SFCSLOPQ
//ADEEMNOE
//ADIDEJFM
//VCEIFGGS
//SGGFIECVAASABCEHJIGQEMS
void Test7()
{
const char* matrix = "ABCEHJIGSFCSLOPQADEEMNOEADIDEJFMVCEIFGGS";
const char* str = "SGGFIECVAASABCEHJIGQEMS";
Test("Test7", (const char*) matrix, 5, 8, str, false);
}
//AAAA
//AAAA
//AAAA
//AAAAAAAAAAAA
void Test8()
{
const char* matrix = "AAAAAAAAAAAA";
const char* str = "AAAAAAAAAAAA";
Test("Test8", (const char*) matrix, 3, 4, str, true);
}
//AAAA
//AAAA
//AAAA
//AAAAAAAAAAAAA
void Test9()
{
const char* matrix = "AAAAAAAAAAAA";
const char* str = "AAAAAAAAAAAAA";
Test("Test9", (const char*) matrix, 3, 4, str, false);
}
//A
//A
void Test10()
{
const char* matrix = "A";
const char* str = "A";
Test("Test10", (const char*) matrix, 1, 1, str, true);
}
//A
//B
void Test11()
{
const char* matrix = "A";
const char* str = "B";
Test("Test11", (const char*) matrix, 1, 1, str, false);
}
void Test12()
{
Test("Test12", nullptr, 0, 0, nullptr, false);
}