forked from wangzheng0822/algo
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
87429c8
commit 369ae71
Showing
2 changed files
with
98 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,77 @@ | ||
package ch39_back_tracking | ||
|
||
import scala.util.control.Breaks.{break, breakable} | ||
|
||
class NQueens(numberOfQueens:Int) { | ||
//use array index to identify the row,the value of the row to identify the column | ||
val result = new Array[Int](numberOfQueens) | ||
var count = 0 | ||
|
||
def calcNQueues(row: Int): Unit = { | ||
if (row == numberOfQueens) { | ||
//everything is done | ||
printNQueens() | ||
return | ||
} | ||
|
||
for (column <- Range(0, numberOfQueens)) { | ||
if (isOkOnColumn(row, column)) { | ||
result(row) = column //place the column value into the array | ||
calcNQueues(row + 1) //calculate next row | ||
} | ||
} | ||
|
||
} | ||
|
||
def isOkOnColumn(row: Int, column: Int): Boolean = { | ||
var ok = true | ||
var leftUp = column - 1 | ||
var rightUp = column + 1 | ||
|
||
breakable { | ||
//will compare all the rows above current row | ||
for (i <- row - 1 to 0 by -1) { | ||
//check current column | ||
if (result(i) == column) { | ||
ok = false | ||
break | ||
} | ||
//check left up | ||
if (leftUp >= 0) { | ||
if (result(i) == leftUp) { | ||
ok = false | ||
break | ||
} | ||
} | ||
//check right up | ||
if (rightUp < numberOfQueens) { | ||
if (result(i) == rightUp) { | ||
ok = false | ||
break | ||
} | ||
} | ||
//move leftUp and rightUp | ||
leftUp -= 1 | ||
rightUp += 1 | ||
} | ||
} | ||
|
||
ok | ||
} | ||
|
||
def printNQueens(): Unit = { | ||
count +=1 | ||
for (row <- Range(0, numberOfQueens)) { | ||
for (column <- Range(0, numberOfQueens)) { | ||
if (result(row) == column) { | ||
print("Q ") | ||
} else { | ||
print("* ") | ||
} | ||
} | ||
//new line for next row | ||
println("") | ||
} | ||
println(count+"==============") | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
package ch39_back_tracking | ||
|
||
import org.scalatest.FlatSpec | ||
|
||
class NQueensTest extends FlatSpec { | ||
|
||
behavior of "NQueensTest" | ||
|
||
it should "calc8Queues" in { | ||
val eightQueens = new NQueens(8) | ||
eightQueens.calcNQueues(0) | ||
|
||
} | ||
|
||
it should "calc4Queues" in { | ||
val eightQueens = new NQueens(4) | ||
eightQueens.calcNQueues(0) | ||
|
||
} | ||
|
||
} |