diff --git a/src/Assignment6/Ex4.sc b/src/Assignment6/Ex4.sc new file mode 100644 index 0000000..229c2bf --- /dev/null +++ b/src/Assignment6/Ex4.sc @@ -0,0 +1,39 @@ +def inCheck(q1: (Int, Int), q2: (Int, Int)) = + q1._1 == q2._1 || // same row + q1._2 == q2._2 || // same column + (q1._1 - q2._1).abs == (q1._2 - q2._2).abs // on diagonal + +def isSafe(queen: (Int, Int), queens: List[(Int, Int)]) = + queens forall (q => !inCheck(queen, q)) + +def queens(n: Int): List[List[(Int, Int)]] = { + def placeQueens(k: Int): List[List[(Int, Int)]] = + if (k == 0) + List(List()) + else + for { + queens <- placeQueens(k - 1) + column <- 1 to n + queen = (k, column) + if isSafe(queen, queens) + } yield queen :: queens + + placeQueens(n) +} + +def printChessBoard(solutions: List[List[(Int, Int)]]): String = { + val sols: List[String] = for ((sol, i) <- solutions.zipWithIndex) yield { + val lines: IndexedSeq[String] = for (y <- 1 to sol.length) yield { + val line: IndexedSeq[String] = { + for (x <- 1 to sol.length) yield { + if (sol contains (y, x)) "♕" else "_" + } + } + line.mkString("|", "|", "|") + } + s"Solution $i:\n" + lines.mkString("\n") + } + sols.mkString("\n\n") +} + +println(printChessBoard(queens(4))) \ No newline at end of file