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

题目描述:

请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。 例如 a b c e s f c s a d e e 这样的3 X 4 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。

回溯法解决(非递归版本有bug 回溯时没还原view数组):

char* matrix = "XBEDFABC";
char* str ="FABCDEB";//测试结果是false 实际为true(牛客依然AC了)...............

move[4]中的元素分别表示下一步方向为上下左右

class Solution {
public:
  bool hasPath(char* matrix, int rows, int cols,char* str){
    int strLength=strlen(str);
    int nowLength=1;
    int move[4]={-cols,cols,-1,1};
    //const int size=rows*cols;
    //牛客不能通过bool view[rows*cols];
    bool view[10000]={0};
    bool view2[10000][4]={false};//改进新加的
    stack Stack;
   // vector pos1;
    for(int t=0;t=0&&dos+move[i]1)
                nowLength--;
            }
        }
        if(nowLength==strLength)
            return true;
         else
            return false;
    }
};
//2018.12.16 代码修订了 解决了开始的bug了

 

递归版:(同剑指offer代码差不多,这个就很好避免了上面非递归版的bug,有空再来解决上面bug,花了好久时间了~~)

class Solution {
public:
    bool hasPath(char* matrix, int rows, int cols, char* str)
    {
        string s(str);
        vector> isVisited(rows, vector(cols, 0));
        for (int i = 0; i < rows * cols; i++) {
            if (bfs(isVisited, matrix, rows, cols, i / cols, i % cols, s, 0)) {
                return true;
            }
        }
        return false;
    }

    bool bfs(vector>& isVisited, char* matrix, int rows, int cols, int x, int y, string& s, int index) {
        if (x < 0 || x >= rows || y < 0 || y >= cols || isVisited[x][y] || matrix[x*cols+y] != s[index])
            return false;
        if (index == s.size()-1)
            return true;
        isVisited[x][y] = 1;
        bool ret = bfs(isVisited, matrix, rows, cols, x-1, y, s, index+1)
                   || bfs(isVisited, matrix, rows, cols, x+1, y, s, index+1)
                   || bfs(isVisited, matrix, rows, cols, x, y-1, s, index+1)
                   || bfs(isVisited, matrix, rows, cols, x, y+1, s, index+1);
        isVisited[x][y] = 0;
        return ret;
    }
};

 

你可能感兴趣的:(剑指offer)