剣指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というパラメータを付けずに、直接ポインタで書いたので、簡潔になりました~褒められます:)