summaryrefslogtreecommitdiffstats
path: root/Algorithms/Part-I/4-Puzzle
diff options
context:
space:
mode:
Diffstat (limited to 'Algorithms/Part-I/4-Puzzle')
-rw-r--r--Algorithms/Part-I/4-Puzzle/Board.java73
1 files changed, 48 insertions, 25 deletions
diff --git a/Algorithms/Part-I/4-Puzzle/Board.java b/Algorithms/Part-I/4-Puzzle/Board.java
index ffc8a7a..e4d9b11 100644
--- a/Algorithms/Part-I/4-Puzzle/Board.java
+++ b/Algorithms/Part-I/4-Puzzle/Board.java
@@ -1,6 +1,6 @@
/* vim: set expandtab tabstop=4 shiftwidth=4 : */
-class Board {
+public class Board {
private int d;
private byte[][] blocks;
@@ -21,13 +21,20 @@ class Board {
{
this.d = blocks[0].length;
- this.openRow = this.d - 1;
- this.openCol = this.d - 1;
this.blocks = new byte[d][d];
for (int i = 0; i < d; i++)
+ {
for (int j = 0; j < d; j++)
+ {
this.blocks[i][j] = (byte) blocks[i][j];
+ if (blocks[i][j] == 0)
+ {
+ this.openRow = i;
+ this.openCol = j;
+ }
+ }
+ }
}
// board dimension N
@@ -79,19 +86,15 @@ class Board {
return true;
}
- private Board swap(int r0, int c0, int r1, int c1)
+ private byte[][] copy()
{
- byte[][] blocks2 = new byte[d][d];
+ byte[][] bytes = new byte[d][d];
for (int i = 0; i < d; i++)
for (int j = 0; j < d; j++)
- blocks2[i][j] = blocks[i][j];
-
- byte tmp = blocks2[r0][c0];
- blocks2[r0][c0] = blocks2[r1][c1];
- blocks2[r1][c1] = tmp;
+ bytes[i][j] = blocks[i][j];
- return new Board(blocks2, openRow, openCol);
+ return bytes;
}
// a board obtained by exchanging two adjacent blocks in the same row
@@ -100,7 +103,13 @@ class Board {
int row = 0;
if (openRow == 0) row = 1;
- return swap(row, 0, row, 1);
+ byte [][]bytes = copy();
+
+ byte tmp = bytes[row][0];
+ bytes[row][0] = bytes[row][1];
+ bytes[row][1] = tmp;
+
+ return new Board(bytes, openRow, openCol);
}
// does this board equal y?
@@ -108,14 +117,27 @@ class Board {
{
if (y == null) return false;
if (y.getClass() != this.getClass()) return false;
-
Board other = (Board) y;
- if (d != other.dimension()) return false;
+ if (d != other.d) return false;
for (int i = 0; i < d; i++)
for (int j = 0; j < d; j++)
- if (blocks[i][j] == other.blocks[i][j]) return true;
- return false;
+ if (blocks[i][j] != other.blocks[i][j]) return false;
+ return true;
+ }
+
+ private Board move(int rowDelta, int colDelta)
+ {
+ byte [][]bytes = copy();
+
+ int or = openRow + rowDelta;
+ int oc = openCol + colDelta;
+
+ byte tmp = bytes[openRow][openCol];
+ bytes[openRow][openCol] = bytes[or][oc];
+ bytes[or][oc] = tmp;
+
+ return new Board(bytes, or, oc);
}
// all neighboring boards
@@ -123,13 +145,13 @@ class Board {
{
Queue<Board> q = new Queue<Board>();
if (openRow != 0)
- q.enqueue(swap(openRow, openCol, openRow - 1, openCol));
+ q.enqueue(move(-1, 0));
if (openRow < d - 1)
- q.enqueue(swap(openRow, openCol, openRow + 1, openCol));
+ q.enqueue(move(1, 0));
if (openCol != 0)
- q.enqueue(swap(openRow, openCol, openRow, openCol - 1));
+ q.enqueue(move(0, -1));
if (openCol < d - 1)
- q.enqueue(swap(openRow, openCol, openRow, openCol + 1));
+ q.enqueue(move(0, 1));
return q;
}
@@ -137,17 +159,18 @@ class Board {
// string representation of the board
public String toString()
{
- String out = "";
+ String out = d+"\n";
+ // out += "open "+openRow+" "+openCol+"\n";
+ // out += "goal "+(isGoal() ? "OK" : "KO")+"\n";
+ // out += "hamming "+hamming()+"\n";
+ // out += "manhattan "+manhattan()+"\n";
for (int i = 0; i < d; i++)
{
for (int j = 0; j < d; j++)
out += " "+(int) blocks[i][j];
out += "\n";
}
- // out += "goal "+(isGoal() ? "OK" : "KO")+"\n";
- // out += "hamming "+hamming()+"\n";
- // out += "manhattan "+manhattan()+"\n";
- return out;
+ return out; //.substring(0, out.length() - 1);
}
}