2016-07-06 12 views
3

私は、迷路を効果的に解決する方法に答えた多くの記事と質問を参照しましたが、ここで私のコードで何がうまくいかないかを確認したいと思います。迷路を考慮する:2次元配列の迷路を解決する

2 1 0 0 3 
0 1 0 1 1 
0 1 0 0 1 
0 1 1 0 0 
0 0 0 0 0 

1さんの壁を表し、0のパスを表す(ソース3 2と宛先です)。 パスがあるかどうかを出力する必要があります。

int y=0; 
     while(y==0) 
     { 
      robo1(n,m,maze);//this function adds 2 to any '0'/'3' in (i,j+1),(i+1,j),(i-1,j),(i,j-1) (if exists),where (i,j) is 2 
      robo2(n,m,k2,maze);//this function adds 3 to any '0'/'2' in (i,j+1),(i+1,j),(i-1,j),(i,j-1) (if exists), where (i,j) is 3 
      if(find5(n,m,maze)==1)//this function returns 1 if there is '5' in the maze 
       y++; 
      if(find0(n,m,maze)==0)//this function returns 0 if there are no '0' in the maze 
       break; 
     } 
     if(find0(n,m,maze)==0 && y==0) 
      printf("-1\n");//no path 
     else 
      printf("1\n");//there is a path 

私の考えでは、ループの任意の数の後に5が迷路で発見された場合、それはパスがある意味するであろうということです。 しかし、この関数をコードで実装すると、私は間違った答えを得たり、時にはランタイムエラーが発生します。 上記のロジックに欠陥がありますか?

+3

'robo1'、 'robo2'、' find5'、 'find0'の実装を提供してください。ランタイムエラーは、これらの関数のいずれかで範囲外に出る可能性があることを意味しますが、コードを書くことは難しいです。 – buld0zzr

+1

私には、そのアプローチが何であるかは不明です。あなたは[深さの最初の検索](https://en.wikipedia.org/wiki/Depth-first_search)を知っていますか? – Codor

+0

この問題はおそらく 'robo *'と 'find *'にありますので、@ buld0zzrと言ってください。ここでのロジックは基本的にはブルートフォース双方向BFS – shole

答えて

5

一般的な考え方はほとんどうまくいくはずですが、もちろんすべてが詳細です。 2と3の両方が壁によって「閉鎖」されているが、0が部屋に存在する場合

2 1 0 0 0 
    1 1 0 1 1 
    0 0 0 1 3 

すなわち:正しく実装されていても、あなたのアプローチは動作しませんした

一つの場合は、しかし、このです。あなたのループは、2つのロボ機能のどちらも回っていないにもかかわらず何も変わらないので、決して終わらないでしょう。

単純な解決策は、実際にはマトリックス内の値を少なくとも変更していて、これが起こらないときには終了することです。

これは非常に効率的な迷路の解決方法ではないことに注意してください(あなたのコードは同じ細胞を繰り返し何度もチェックし続けます)。

+0

アルゴリズム自体を表示するための良い例(私が推測する)は動作していない良い(それは "最高"ではないが)大丈夫だと思います! – shole

+0

ありがとう.....私はDFSやA *のようないくつかのアプローチを行っていましたが、これは上記のアプローチよりも効果的です.....このアプローチの欠陥を知りたいだけでした – yobro97