classSolution{int dx[4]={0,0,1,-1};int dy[4]={1,-1,0,0};bool** vis;public:boolhasPath(char* matrix,int rows,int cols,char* str){
vis =newbool*[rows];for(int i =0; i < rows;++i){
vis[i]=newbool[cols];memset(vis[i],false,sizeof(bool)* cols);}bool flag =false;int x, y;for(int i =0; i <strlen(matrix)&&!flag;++i){if(matrix[i]== str[0]){
x = i / cols;
y = i % cols;
vis[x][y]=true;
flag =dfs(x, y, matrix, rows, cols, str,0);
vis[x][y]=false;}}delete[] vis;return flag;}booldfs(int x,int y,char* matrix,int rows,int cols,char* str,int index){if(index +1==strlen(str))returntrue;for(int i =0; i <4;++i){int nx = x + dx[i];int ny = y + dy[i];if(judge(nx, ny, matrix, rows, cols, str, index +1)){
vis[nx][ny]=true;if(dfs(nx, ny, matrix, rows, cols, str, index +1))// 这里最开始手误写成++index了。不能++,因为回溯的时候,index必须保持之前的值returntrue;
vis[nx][ny]=false;}}returnfalse;}booljudge(int x,int y,char* matrix,int rows,int cols,char* str,int index){if(x <0|| x >= rows || y <0|| y >= cols)returnfalse;return matrix[x * cols + y]== str[index]&&!vis[x][y];}};