2016-05-27 4 views
-1

これは、迷路アルゴリズムの変更についてです。与えられたアルゴリズムのわずかな変更

どういう意味ですか? 0と1で塗りつぶされた2次元配列が得られます。ここで0は「渡すことができません」を意味し、1は「可能にする」を意味します。 そのアルゴリズムは、xからyへの道を見つけます(既知の例:catからmouse)。 これは、以下のアルゴリズムが行っていることです。

は、入力として、我々は得た:

{1, 0, 0,}, 
{1, 1, 0}, 
{0, 1, 1} }; 

そして出力:

  1. 変更の開始と終了位置(このアルゴリズムの開始:私はいくつかの小さな物事を変えたい

    (0,0) // ressembles the coordinates of the 1 in top left corner 
    (1,0) // ressembles the 1 under the first 1 I just explained 
    (1,1) // ... 
    (2,1) 
    (2,2) 
    

    を左下と右下に終わります) - 私は私の左下から始まり、右上から終わります。

  2. このアルゴリズムは上下に動かすことができます - 私は上下に移動したいだけです。私はかなり確信しているが、私はそれをコーディングする方法がわからない、実行する必要がどのような変更

:1の場合 )の問題があると思われる:どういうわけか

public List<Coordinate> solve() { 
     return getMazePath(0, 0, new Stack<Coordinate>()); 
    } 

、I 2番目のゼロを0-1とする必要がありますが、xとyの宣言にアクセスできない場合はどうすればよいですか?私は本当に0-1が左上ではなく左下でスタートさせると信じています、そうですか?

2)については、列の変更も必要です。 +1の代わりに-1が必要です、そうですか?

テキストの壁のために申し訳ありません

は、私は本当に短いそれを維持しようとしたが、私は失敗しているように見える:とにかくP 私は誰かが変化することなく、この^^

アルゴリズムを読むことを願っています:

import java.util.Arrays; 
import java.util.*; 

final class Coordinate { 
    private final int x; 
    private final int y; 

    public Coordinate(int x, int y) { 
     this.x = x; 
     this.y = y; 
    } 

    public int getX() { 
     return x; 
    } 

    public int getY() { 
     return y; 
    } 
} 

public class Alg { 

    private final int[][] maze; 

    public Alg(int[][] maze) { 
     if (maze == null) { 
      throw new NullPointerException("The input maze cannot be null"); 
     } 
     if (maze.length == 0) { 
      throw new IllegalArgumentException("The size of maze should be greater than 0"); 
     } 

     this.maze = maze; 
    } 

    public List<Coordinate> solve() { 
     return getMazePath(0, 0, new Stack<Coordinate>()); 
    } 

    private List<Coordinate> getMazePath(int row, int col, Stack<Coordinate> stack) { 
     assert stack != null; 

     stack.add(new Coordinate(row, col)); 

     if ((row == maze.length - 1) && (col == maze[0].length - 1)) { 
      Coordinate[] coordinateArray = stack.toArray(new Coordinate[stack.size()]); 
      return Arrays.asList(coordinateArray); 
     } 

     for (int j = col; j < maze[row].length; j++) { 

      if ((j + 1) < maze[row].length && maze[row][j + 1] == 1) { 
       return getMazePath(row, j + 1, stack); 
      } 

      if ((row + 1) < maze.length && maze[row + 1][col] == 1) { 
       return getMazePath(row + 1, col, stack); 
      } 
     } 

     return Collections.emptyList(); 
    } 


    public static void main(String[] args) { 
     int[][] m = { {1, 0, 0,}, 
         {1, 1, 0}, 
         {0, 1, 1} }; 

     Alg maze = new Alg(m); 

     for (Coordinate coord : maze.solve()) { 
      System.out.println("("+coord.getX() + "," + coord.getY()+")"); 
     } 
    } 
} 
+0

重複: [1](http://stackoverflow.com/q/37480866/522444)、 [2](http://stackoverflow.com/q/37482819/522444)、 [3]( http://stackoverflow.com/q/37480866/522444)、 [4](http://stackoverflow.com/q/37485751/522444)、[5](http://stackoverflow.com/q/37490334/522444)。 –

答えて

0

getMazePathのメソッド宣言を見てください。現在の0、0は、その引数にrowcolとして渡されます。したがって、現在コード化されているメソッドに0、0を送るのではなく、2、0(2行目、0列目、左下)を送信します。

方向の動きがそのgetMazePath()方法内側forループであり、2つの列j + 1 1(右側の列)または行row + 1(現在の下の行)である場合ステートメントは確認してください。プラスの代わりにマイナスを使用して、それぞれ左に移動するか、上に移動します。

+2

ダニエル:あなたは時間を無駄にしています。このポスターには同じ質問が何度も何度も繰り返されています。彼は答えを無視して誰かに彼のコードを書くように努めています。 –

+0

この回答に感謝します。それが私が探していたものなので、あなたは緑の小切手を手に入れようとしています。それは今の魅力のように機能します。あなたのホバークラフトにとって、私はあなたの問題が本当にわからない。これは今、このサイトの最初と最後の質問でした。あなたのような人生がなければ、それは本当に必要ありません。 –

+0

@HovercraftFullOfEelsはヘッドアップに感謝します。私は彼が多重支配したのか分からなかった。簡単な質問と私の簡単な答えのように思えました。私の答えを入力し始めたとき、質問には下降音はありませんでした... –

関連する問題