1 |
|
2 import scala.concurrent._ |
|
3 import scala.concurrent.duration._ |
|
4 import ExecutionContext.Implicits.global |
|
5 import scala.language.postfixOps |
|
6 |
|
7 type Pos = (Int, Int) // a position on a chessboard |
|
8 type Path = List[Pos] // a path...a list of positions |
|
9 |
|
10 def count_all_tours_urban(dim: Int) = { |
|
11 for (i <- (0 until dim).toList; |
|
12 j <- (0 until dim).toList) yield CW7a.count_tours(dim, List((i, j))) |
|
13 } |
|
14 |
|
15 def add_pair_urban(x: Pos)(y: Pos): Pos = |
|
16 (x._1 + y._1, x._2 + y._2) |
|
17 |
|
18 def is_legal_urban(dim: Int, path: Path)(x: Pos): Boolean = |
|
19 0 <= x._1 && 0 <= x._2 && x._1 < dim && x._2 < dim && !path.contains(x) |
|
20 |
|
21 def moves_urban(x: Pos): List[Pos] = |
|
22 List(( 1, 2),( 2, 1),( 2, -1),( 1, -2), |
|
23 (-1, -2),(-2, -1),(-2, 1),(-1, 2)).map(add_pair_urban(x)) |
|
24 |
|
25 def legal_moves_urban(dim: Int, path: Path, x: Pos): List[Pos] = |
|
26 moves_urban(x).filter(is_legal_urban(dim, path)) |
|
27 |
|
28 def correct_urban(dim: Int)(p: Path): Boolean = p match { |
|
29 case Nil => true |
|
30 case x::Nil => true |
|
31 case x::y::p => if (legal_moves_urban(dim, p, y).contains(x)) correct_urban(dim)(y::p) else false |
|
32 } |
|
33 |
|
34 |
|
35 lazy val f = Future { |
|
36 assert(count_all_tours_urban(1) == List(1)) |
|
37 assert(count_all_tours_urban(2) == List(0, 0, 0, 0)) |
|
38 assert(count_all_tours_urban(3) == List(0, 0, 0, 0, 0, 0, 0, 0, 0)) |
|
39 assert(count_all_tours_urban(4) == List(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)) |
|
40 assert(count_all_tours_urban(5) == List(304, 0, 56, 0, 304, 0, 56, 0, 56, 0, 56, 0, 64, 0, 56, 0, 56, 0, 56, 0, 304, 0, 56, 0, 304)) |
|
41 |
|
42 val ts = CW7a.enum_tours(5, List((0, 2))) |
|
43 assert(ts.map(correct_urban(5)).forall(_ == true) == true) |
|
44 assert(ts.length == 56) |
|
45 } |
|
46 |
|
47 Await.result(f, 360 second) |
|