剣指offer-面接問題12:マトリクスのパス-C++

2336 ワード

class Solution {
public:
    bool hasPath(char* matrix, int rows, int cols, char* str)
    {
        if(matrix==nullptr || rows<1 || cols<1 || str==nullptr ) {
            return false;
        }
        
        bool* visited = new bool[rows*cols];
        memset(visited, 0, rows*cols);
        int pathLength = 0;
        
        for(int row=0; row=0 && row=0 && col

 
関連する再帰は複雑なので,本の解を写した.
3回目です.コードが長いので、書き間違えました.
0回目のセルフテスト:ブランチにreturnがないことが判明し、追加しました.
1回目:マトリクスvisitedを2回変更して下付きの値の角カッコで丸カッコに書き、visitedがfunctionではないことを提示して修正します.if文の2つの条件の間にうっかりセミコロンが追加されました.
最初にコンパイルに成功したことを提示したが、case通過率は30+%で、与えられたことのないcase検査に従って、半日検査しても大丈夫だと思ったので、visited[row*cols+col]の*が+と書かれているのを見て、修正してから答えが通過した.
まとめ
マトリクス問題の実装にはいくつかの対応があります.
1.行列->2 D配列
2.上下左右に歩く->row+-1,col+-1;
再帰要素:
1.再帰の最後に戻る
2.複雑な一般状況は、自身を再帰的に呼び出し、戻り値をとる.
この問題は私にとってまだ難しいです.
 
 
にブラシをかける
class Solution {
public:
    bool hasPath(char* matrix, int rows, int cols, char* str)
    {
        if(matrix==nullptr || rows<1 || cols<1 || str==nullptr) return false;
            
        //     Core visited        ,        
        bool* visited = new bool[rows*cols];
        memset(visited, 0, rows*cols);  //      
        
        for(int row=0; row=0 && row=0 && col

3回目です.今回は初めての书き込みを参考にしていましたが、书きながら考えました.
1箇所を間違えて貼り付け忘れてしまうと、visitedはvisited[row][col]でアクセスできません.単純なポインタなので、2次元配列として明記されていません.
今回はpathLengthというパラメータを付けずに、直接ポインタで書いたので、簡潔になりました~褒められます:)