Skip to content

Commit 0fbc326

Browse files
committed
nqueens
refactoring added junit tests
1 parent 2a006d3 commit 0fbc326

File tree

6 files changed

+161
-59
lines changed

6 files changed

+161
-59
lines changed

NQueens-backtrack/src/main/java/com/dodecaedro/App.java renamed to NQueens-backtrack/src/main/java/com/dodecaedro/NqueensMain.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
* Hello world!
1010
*
1111
*/
12-
public class App {
12+
public class NqueensMain {
1313
public static void main(String[] args) {
1414
BacktrackNode initialNode = new NQueensNode();
1515
BacktrackAlgorithm.solve(initialNode);

NQueens-backtrack/src/main/java/com/dodecaedro/backtrack/nqueens/NQueensNode.java

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
*
1515
*/
1616
public class NQueensNode implements BacktrackNode {
17-
private static final int N = 4;
17+
public static final int SIZE = 4;
1818

1919
private List<Queen> queens;
2020
private List<BacktrackNode> childrenNodes;
@@ -37,7 +37,7 @@ private NQueensNode(NQueensNode copy) {
3737
public boolean isLeaf() {
3838
// it's a leaf when it has all the queens, or there's no point in
3939
// continuing
40-
return queens.size() == N || anyQueenInDanger();
40+
return queens.size() == SIZE || anyQueenInDanger();
4141
}
4242

4343
/*
@@ -47,7 +47,7 @@ public boolean isLeaf() {
4747
*/
4848
public boolean isGoal() {
4949
// the goal is to have all the n queens where none endangers any other
50-
return queens.size() == N && !anyQueenInDanger();
50+
return queens.size() == SIZE && !anyQueenInDanger();
5151
}
5252

5353
/*
@@ -57,8 +57,8 @@ public boolean isGoal() {
5757
*/
5858
private void generateChildrenNodes() {
5959
List<BacktrackNode> nodes = new ArrayList<BacktrackNode>();
60-
for (int y = 1; y <= N; y++) {
61-
for (int x = 1; x <= N; x++) {
60+
for (int y = 1; y <= SIZE; y++) {
61+
for (int x = 1; x <= SIZE; x++) {
6262
if (!hasQueen(x, y)) {
6363
// make a copy of the current node which includes current queens
6464
NQueensNode childrenNode = new NQueensNode(this);
@@ -78,19 +78,20 @@ public Collection<BacktrackNode> getChildrenNodes() {
7878
return childrenNodes;
7979
}
8080

81-
private boolean anyQueenInDanger() {
81+
public boolean anyQueenInDanger() {
8282
for (Queen queen : this.queens) {
8383
for (Queen compareQueen : this.queens) {
8484
// don't compare a queen with herself
8585
if (!queen.equals(compareQueen)) {
8686
// is same horizontal row or vertical column?
87-
if (queen.isInXRow(compareQueen.getPositionX()) ||
88-
queen.isInYColumn(compareQueen.getPositionY())) {
89-
System.out.println("Collision found: " + queen.toString() + " collides with: " + compareQueen.toString() + " - same line");
87+
if (queen.isInSameXRow(compareQueen) ||
88+
queen.isInSameYColumn(compareQueen)) {
89+
System.out.println("Collision found: " + queen.toString() +
90+
" collides with: " + compareQueen.toString() + " - same line");
9091
return true;
9192
} else {
9293
// is in the same diagonal?
93-
if (queen.isInDiagonal(compareQueen.getPositionX(), compareQueen.getPositionY(), N)) {
94+
if (queen.isInSameDiagonal(compareQueen)) {
9495
return true;
9596
}
9697
}

NQueens-backtrack/src/main/java/com/dodecaedro/backtrack/nqueens/Queen.java

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -17,39 +17,43 @@ public int getPositionY() {
1717
return this.positionY;
1818
}
1919

20-
public boolean isInXRow(int row) {
21-
return this.positionX == row;
20+
public boolean isInSameXRow(Queen otherQueen) {
21+
return this.positionY == otherQueen.positionY;
2222
}
2323

24-
public boolean isInYColumn(int column) {
25-
return this.positionY == column;
24+
public boolean isInSameYColumn(Queen otherQueen) {
25+
return this.positionX == otherQueen.positionX;
2626
}
2727

28-
public boolean isInDiagonal(int rowX, int columnY, int limit) {
29-
// move right and down
30-
int currentXRow = positionX+1;
31-
int currentYColumn = positionY+1;
32-
while (currentXRow<=limit && currentYColumn<=limit) {
33-
if (rowX == currentXRow && columnY == currentYColumn) {
34-
System.out.println("Collision found: " + this.toString() + " collides with: " + rowX + ":" + columnY + " - same diagonal");
28+
public boolean isInSameDiagonal(Queen otherQueen) {
29+
// first diagonal \
30+
if ((this.positionX-this.positionY)==(otherQueen.positionX-otherQueen.positionY)) {
31+
return true;
32+
}
33+
// now test /
34+
// down and left
35+
int posX = this.positionX;
36+
int posY = this.positionY;
37+
while(posX >= 0 && posY <= NQueensNode.SIZE) {
38+
posX--;
39+
posY++;
40+
if (posX == otherQueen.positionX && posY == otherQueen.positionY) {
3541
return true;
36-
}
37-
currentXRow++;
38-
currentYColumn++;
42+
}
3943
}
4044

41-
// move left and up
42-
currentXRow = positionX-1;
43-
currentYColumn = positionY-1;
44-
while (currentXRow>=1 && currentYColumn>=1) {
45-
if (rowX == currentXRow && columnY == currentYColumn) {
46-
System.out.println("Collision found: " + this.toString() + " collides with: " + rowX + ":" + columnY + " - same diagonal");
45+
// up and right
46+
posX = this.positionX;
47+
posY = this.positionY;
48+
while(posX <= NQueensNode.SIZE && posX <= NQueensNode.SIZE) {
49+
posX++;
50+
posY--;
51+
if (posX == otherQueen.positionX && posY == otherQueen.positionY) {
4752
return true;
48-
}
49-
currentXRow--;
50-
currentYColumn--;
53+
}
5154
}
5255

56+
// not in any same diagonal
5357
return false;
5458
}
5559

NQueens-backtrack/src/test/java/com/dodecaedro/AppTest.java

Lines changed: 0 additions & 25 deletions
This file was deleted.
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package com.dodecaedro;
2+
3+
import static org.junit.Assert.assertFalse;
4+
import static org.junit.Assert.assertTrue;
5+
6+
import org.junit.BeforeClass;
7+
import org.junit.Test;
8+
9+
import com.dodecaedro.backtrack.nqueens.NQueensNode;
10+
11+
/**
12+
* Unit test for simple App.
13+
*/
14+
public class NqueensNodeTest {
15+
private static NQueensNode nodeSafe;
16+
private static NQueensNode nodeDanger;
17+
private static NQueensNode nodeIncomplete;
18+
19+
@BeforeClass
20+
public static void setUp() {
21+
nodeSafe = new NQueensNode();
22+
nodeSafe.addQueen(2, 1);
23+
nodeSafe.addQueen(4, 2);
24+
nodeSafe.addQueen(1, 3);
25+
nodeSafe.addQueen(3, 4);
26+
27+
nodeDanger = new NQueensNode();
28+
nodeDanger.addQueen(1, 1);
29+
nodeDanger.addQueen(3, 2);
30+
nodeDanger.addQueen(2, 1);
31+
nodeDanger.addQueen(3, 1);
32+
33+
nodeIncomplete = new NQueensNode();
34+
nodeIncomplete.addQueen(2, 1);
35+
nodeIncomplete.addQueen(4, 2);
36+
}
37+
38+
@Test
39+
public void testDanger() {
40+
assertTrue(nodeDanger.anyQueenInDanger());
41+
assertFalse(nodeSafe.anyQueenInDanger());
42+
}
43+
44+
@Test
45+
public void testGoal() {
46+
assertTrue(nodeSafe.isGoal());
47+
assertFalse(nodeDanger.isGoal());
48+
assertFalse(nodeIncomplete.isGoal());
49+
}
50+
51+
@Test
52+
public void testLeaf() {
53+
assertTrue(nodeSafe.isLeaf());
54+
assertTrue(nodeDanger.isLeaf());
55+
assertFalse(nodeIncomplete.isLeaf());
56+
}
57+
58+
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package com.dodecaedro;
2+
3+
import static org.junit.Assert.*;
4+
5+
import org.junit.Test;
6+
7+
import com.dodecaedro.backtrack.nqueens.Queen;
8+
9+
public class QueenTest {
10+
@Test
11+
public void queenEqualsTest() {
12+
Queen queen1 = new Queen(1,1);
13+
Queen queen2 = new Queen(1,1);
14+
Queen queen3 = new Queen(1,2);
15+
16+
assertTrue(queen1.equals(queen2));
17+
assertTrue(queen1.equals(queen1));
18+
assertFalse(queen1.equals(null));
19+
assertFalse(queen1.equals(queen3));
20+
}
21+
22+
@Test
23+
public void testQueenRow() {
24+
Queen queen1 = new Queen(1,1);
25+
Queen queen2 = new Queen(3,1);
26+
Queen queen3 = new Queen(1,2);
27+
28+
assertTrue(queen1.isInSameXRow(queen2));
29+
assertFalse(queen1.isInSameXRow(queen3));
30+
}
31+
32+
@Test
33+
public void testQueenColumn() {
34+
Queen queen1 = new Queen(2,1);
35+
Queen queen2 = new Queen(2,2);
36+
Queen queen3 = new Queen(3,1);
37+
38+
assertTrue(queen1.isInSameYColumn(queen2));
39+
assertFalse(queen1.isInSameYColumn(queen3));
40+
}
41+
42+
@Test
43+
public void testQueenDiagonal() {
44+
Queen queen1 = new Queen(2,2);
45+
Queen queen2 = new Queen(1,1);
46+
Queen queen3 = new Queen(3,1);
47+
Queen queen4 = new Queen(1,3);
48+
Queen queen5 = new Queen(3,3);
49+
50+
Queen queen6 = new Queen(2,1);
51+
52+
assertTrue(queen1.isInSameDiagonal(queen2));
53+
assertTrue(queen1.isInSameDiagonal(queen3));
54+
assertTrue(queen1.isInSameDiagonal(queen4));
55+
assertTrue(queen1.isInSameDiagonal(queen5));
56+
57+
assertFalse(queen1.isInSameDiagonal(queen6));
58+
59+
Queen queen7 = new Queen(3,4);
60+
Queen queen8 = new Queen(2,1);
61+
62+
assertFalse(queen7.isInSameDiagonal(queen8));
63+
}
64+
}

0 commit comments

Comments
 (0)