矩陣中的路徑


題目

比如在以下的3*4的矩陣中包括一條字符串”bcced”的路徑。

但矩陣中不包括字符串“abcb”的路徑,因為字符串的第一個字符b占領了矩陣中的第一行第二格子之后,路徑不能再次進入這個格子。

a b c e 
s f c s 
a d e e

解題思路

分析:回溯算法
  這是一個可以用回朔法解決的典型題。首先,在矩陣中任選一個格子作為路徑的起點。如果路徑上的第i個字符不是ch,那么這個格子不可能處在路徑上的
第i個位置。如果路徑上的第i個字符正好是ch,那么往相鄰的格子尋找路徑上的第i+1個字符。除在矩陣邊界上的格子之外,其他格子都有4個相鄰的格子。
重復這個過程直到路徑上的所有字符都在矩陣中找到相應的位置。
  由於回朔法的遞歸特性,路徑可以被開成一個棧。當在矩陣中定位了路徑中前n個字符的位置之后,在與第n個字符對應的格子的周圍都沒有找到第n+1個
字符,這個時候只要在路徑上回到第n-1個字符,重新定位第n個字符。
  由於路徑不能重復進入矩陣的格子,還需要定義和字符矩陣大小一樣的布爾值矩陣,用來標識路徑是否已經進入每個格子。 當矩陣中坐標為(row,col)的
格子和路徑字符串中相應的字符一樣時,從4個相鄰的格子(row,col-1),(row-1,col),(row,col+1)以及(row+1,col)中去定位路徑字符串中下一個字符
如果4個相鄰的格子都沒有匹配字符串中下一個的字符,表明當前路徑字符串中字符在矩陣中的定位不正確,我們需要回到前一個,然后重新定位。
  一直重復這個過程,直到路徑字符串上所有字符都在矩陣中找到合適的位置

class Solution {
public:
    bool hasPath(char* matrix, int rows, int cols, char* str)
    {
        if(!matrix||!str)
            return false;
        
        vector<vector<bool>> flag(rows,vector<bool>(cols,false));
        int len=0;
        for(int i=0;i<rows;++i)
        {
            for(int j=0;j<cols;++j)
                if(hasPathCore(i,j,rows,cols,len,matrix,str,flag))
                    return true;
        }
        return false;
    }
private:
    bool hasPathCore(int i,int j,int rows,int cols,int len,char *matrix,char *str,vector<vector<bool>> &flag)
    {
        if(str[len]=='\0')
            return true;
        bool hasPath=false;
        
        if(i>=0&&i<rows&&j>=0&&j<cols&&str[len]==matrix[i*cols+j]&&!flag[i][j])
        {
            ++len;
            flag[i][j]=true;
            
            hasPath=hasPathCore(i+1,j,rows,cols,len,matrix,str,flag)||
                    hasPathCore(i-1,j,rows,cols,len,matrix,str,flag)||
                    hasPathCore(i,j+1,rows,cols,len,matrix,str,flag)||
                    hasPathCore(i,j-1,rows,cols,len,matrix,str,flag);
            
            if(!hasPath)
            {
                --len;
                flag[i][j]=false;
            }
        }
        return hasPath;
    }
};

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM