class Solution {
public:
int x[4] = { 1,-1,0,0 };
int y[4] = { 0,0,1,-1 };
bool flags[20][20] = { false };
bool flagf = false;
void dfs(int i, int j, vector<vector<char> > &vv, char*str, int index, int rows, int cols,int len)
{
if (str[index] != vv[i][j]) return;
flags[i][j] = true;
if (index==len-1)
{
flagf = true;
return;
}
for (int k = 0; k < 4; k++)
{
if (i + x[k] >= 0 && j + y[k] >= 0 && i + x[k] < rows&&j + y[k] < cols && !flags[i + x[k]][j + y[k]])
{
dfs(i + x[k], j + y[k], vv, str, index + 1, rows, cols,len);
flags[i + x[k]][j + y[k]] = false;
}
}
}
bool hasPath(char* matrix, int rows, int cols, char* str)
{
vector<vector<char> > vv;
vector<char> v;
int c = 0;
for (int i = 0; i < rows; i++)
{
v.clear();
for (int j = 0; j < cols; j++)
{
v.push_back(matrix[c++]);
}
vv.push_back(v);
}
if (str[0] == '\0') return false;
int len = 0;
while (str[len] != '\0')
{
len++;
}
char start = str[0];
int starti, startj;
bool flag = false;
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
if (start == vv[i][j])
{
starti = i;
startj = j;
int index = 0;
dfs(starti, startj, vv, str, index, rows, cols,len);
if (flagf)
return flagf;
flags[starti][startj] = false;
}
}
return false;
}
};