2013-11-21 77 views
0

給定的代碼包含了構建迷宮的一切,我寫了makeMove方法來解決迷宮問題,我已經完成並且工作正常。然而,一切都是爲了在迷宮中使用二維數組並進行訪問,我需要編輯它以便與一維數組一起用於迷宮並訪問。改變2-d迷宮求解器與1-d一起使用

public abstract class AbstractMaze { 

protected int startRow; // starting row 
protected int startCol; // starting column 
protected int endRow;  // ending row 
protected int endCol;  // ending column 

/** 
* Declare the maze, 1's are walls and 0's are open 
*/ 
protected int[][] maze; 

protected AbstractMaze(int[][] maze, int startRow, int startCol, int endRow, int endCol) { 
    super(); 
    this.maze = maze; 
    this.startRow = startRow; 
    this.startCol = startCol; 
    this.endRow = endRow; 
    this.endCol = endCol; 
} 
public void solve() { 
    makeMove(startRow, startCol) 
} 
protected abstract void makeMove(int row, int col); 
} 

public class Maze2 extends AbstractMaze 
{ 
public Maze2(int[][] maze, int startRow, int startCol, int endRow, int endCol) { 
    super(maze, startRow, startCol, endRow, endCol); 
} 
int MAX_ROWS = endRow + 1; 
int MAX_COLS = endCol + 1; 
boolean[][]visited = new boolean[MAX_ROWS][MAX_COLS]; 
protected void makeMove(int row, int col) 
{ 
    boolean found = false; 
    if (row < 0 || row >= MAX_ROWS || col < 0 || col >= MAX_COLS || visited[row][col] || maze[row][col] == 1) 
     return; 

    visited[row][col] = true; 
    found = row == endRow && col == endCol; 

    if (!found) { 
     makeMove(row, col - 1); 
     makeMove(row, col + 1); 
     makeMove(row - 1, col); 
     makeMove(row + 1, col); 
    } 

我需要改變的每處地方的迷宮[] []是,參觀[] []?最簡單的方法是什麼?

感謝您的幫助!

+0

我似乎無法理解你將如何創建一維迷宮,然後解決它。沒有像一維迷宮那樣的東西,至少在迷宮中必須有兩個方向。 – ThaBomb

+0

也許是2D迷宮的一維表示?例如,前10個元素是第1行,第10行第2行等。然後,只需要在行之間移動一些數學操作? – fjc

+0

如果是這樣的話,他應該保持他的代碼原樣,因爲在2D數組中可以更容易地解決問題,只需在程序的開始和結束處使用轉換器,即可將輸入的1D轉換爲2D,解決它,然後將其作爲1D返回。 – ThaBomb

回答

1

我假設你想改變給定的2D maze數組成爲1D maze類成員。聲明maze成員作爲

int ROWS = maze.length; 
int COLS = maze[0].length; 
this.maze = new int[ROWS * COLS]; 

你可以索引此數組maze[COLS * row + col]。然後,您需要的元素複製過來:

for (int r = 0; r < ROWS; r++) 
    for (int c = 0; c < COLS; c++) 
     this.maze[COLS * r + c] = maze[r][c]; 

正如你所看到的,訪問的元素通過this.maze[COLS * r + c]而不是this.maze[r][c]完成。您可以將其視爲採用二維數組並將這些行連接在一起形成一個長的一維數組。

類似地,visited數組可以被聲明爲visited[MAX_COLS * MAX_ROWS]並且通過visited[MAX_COLS * row + col]索引。

+0

這將在maze2類中完成? – user2745043

+0

@ user2745043你知道你現在的代碼中有多少'this.maze = maze;'?這就是我提供的大多數代碼都是替代的。其他的東西只是改變聲明和訪問元素等。 – Zong