| author | Christian Urban <christian.urban@kcl.ac.uk> | 
| Sun, 31 Jan 2021 03:24:32 +0000 | |
| changeset 392 | e776db3c808b | 
| parent 391 | 048fc6b70776 | 
| child 421 | 864107857d27 | 
| permissions | -rw-r--r-- | 
| 391 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 1 | // Part 1 about finding and counting Knight's tours | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 2 | //================================================== | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 3 | |
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 4 | object CW9a {   // for preparing the jar
 | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 5 | |
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 6 | type Pos = (Int, Int) // a position on a chessboard | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 7 | type Path = List[Pos] // a path...a list of positions | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 8 | |
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 9 | |
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 10 | // for measuring time in the JAR | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 11 | def time_needed[T](code: => T) : T = {
 | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 12 | val start = System.nanoTime() | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 13 | val result = code | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 14 | val end = System.nanoTime() | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 15 |   println(f"Time needed: ${(end - start) / 1.0e9}%3.3f secs.")
 | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 16 | result | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 17 | } | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 18 | |
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 19 | // for printing a board | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 20 | def print_board(dim: Int, path: Path): Unit = {
 | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 21 | println() | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 22 |   for (i <- 0 until dim) {
 | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 23 |     for (j <- 0 until dim) {
 | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 24 |       print(f"${path.reverse.indexOf((j, dim - i - 1))}%3.0f ")
 | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 25 | } | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 26 | println() | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 27 | } | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 28 | } | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 29 | |
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 30 | def is_legal(dim: Int, path: Path, x: Pos): Boolean = | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 31 | 0 <= x._1 && 0 <= x._2 && x._1 < dim && x._2 < dim && !path.contains(x) | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 32 | |
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 33 | // testcases | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 34 | //assert(is_legal(8, Nil, (3, 4)) == true) | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 35 | //assert(is_legal(8, List((4, 1), (1, 0)), (4, 1)) == false) | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 36 | //assert(is_legal(2, Nil, (0, 0)) == true) | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 37 | |
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 38 | |
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 39 | def add_pair(x: Pos, y: Pos): Pos = | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 40 | (x._1 + y._1, x._2 + y._2) | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 41 | |
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 42 | def moves(x: Pos): List[Pos] = | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 43 | List(( 1, 2),( 2, 1),( 2, -1),( 1, -2), | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 44 | (-1, -2),(-2, -1),(-2, 1),(-1, 2)).map(add_pair(x, _)) | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 45 | |
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 46 | // 1 mark | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 47 | |
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 48 | def legal_moves(dim: Int, path: Path, x: Pos): List[Pos] = | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 49 | moves(x).filter(is_legal(dim, path, _)) | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 50 | |
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 51 | |
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 52 | |
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 53 | // testcases | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 54 | //assert(legal_moves(8, Nil, (2,2)) == | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 55 | // List((3,4), (4,3), (4,1), (3,0), (1,0), (0,1), (0,3), (1,4))) | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 56 | //assert(legal_moves(8, Nil, (7,7)) == List((6,5), (5,6))) | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 57 | //assert(legal_moves(8, List((4,1), (1,0)), (2,2)) == | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 58 | // List((3,4), (4,3), (3,0), (0,1), (0,3), (1,4))) | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 59 | //assert(legal_moves(8, List((6,6)), (7,7)) == List((6,5), (5,6))) | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 60 | //assert(legal_moves(8, Nil, (0,1)) == List((1,3), (2,2), (2,0))) | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 61 | //assert(legal_moves(1, Nil, (0,0)) == List()) | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 62 | //assert(legal_moves(2, Nil, (0,0)) == List()) | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 63 | //assert(legal_moves(3, Nil, (0,0)) == List((1,2), (2,1))) | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 64 | |
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 65 | // 2 marks | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 66 | |
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 67 | def tcount_tours(dim: Int, path: Path): Int = {
 | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 68 | if (path.length == dim * dim) 1 | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 69 | else | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 70 | (for (x <- legal_moves(dim, path, path.head)) yield tcount_tours(dim, x::path)).sum | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 71 | } | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 72 | |
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 73 | def count_tours(dim: Int, path: Path) = | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 74 | time_needed(tcount_tours(dim: Int, path: Path)) | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 75 | |
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 76 | |
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 77 | def tenum_tours(dim: Int, path: Path): List[Path] = {
 | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 78 | if (path.length == dim * dim) List(path) | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 79 | else | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 80 | (for (x <- legal_moves(dim, path, path.head)) yield tenum_tours(dim, x::path)).flatten | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 81 | } | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 82 | |
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 83 | def enum_tours(dim: Int, path: Path) = | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 84 | time_needed(tenum_tours(dim: Int, path: Path)) | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 85 | |
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 86 | // test cases | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 87 | |
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 88 | /* | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 89 | def count_all_tours(dim: Int) = {
 | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 90 | for (i <- (0 until dim).toList; | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 91 | j <- (0 until dim).toList) yield count_tours(dim, List((i, j))) | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 92 | } | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 93 | |
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 94 | def enum_all_tours(dim: Int): List[Path] = {
 | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 95 | (for (i <- (0 until dim).toList; | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 96 | j <- (0 until dim).toList) yield enum_tours(dim, List((i, j)))).flatten | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 97 | } | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 98 | |
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 99 | |
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 100 | println("Number of tours starting from (0, 0)")
 | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 101 | |
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 102 | for (dim <- 1 to 5) {
 | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 103 |   println(s"${dim} x ${dim} " + time_needed(0, count_tours(dim, List((0, 0)))))
 | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 104 | } | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 105 | |
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 106 | println("Number of tours starting from all fields")
 | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 107 | |
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 108 | for (dim <- 1 to 5) {
 | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 109 |   println(s"${dim} x ${dim} " + time_needed(0, count_all_tours(dim)))
 | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 110 | } | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 111 | |
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 112 | for (dim <- 1 to 5) {
 | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 113 | val ts = enum_tours(dim, List((0, 0))) | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 114 |   println(s"${dim} x ${dim} ")   
 | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 115 |   if (ts != Nil) {
 | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 116 | print_board(dim, ts.head) | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 117 | println(ts.head) | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 118 | } | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 119 | } | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 120 | */ | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 121 | |
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 122 | // 1 mark | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 123 | |
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 124 | def first(xs: List[Pos], f: Pos => Option[Path]): Option[Path] = xs match {
 | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 125 | case Nil => None | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 126 |   case x::xs => {
 | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 127 | val result = f(x) | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 128 | if (result.isDefined) result else first(xs, f) | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 129 | } | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 130 | } | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 131 | |
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 132 | // test cases | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 133 | //def foo(x: (Int, Int)) = if (x._1 > 3) Some(List(x)) else None | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 134 | // | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 135 | //first(List((1, 0),(2, 0),(3, 0),(4, 0)), foo) | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 136 | //first(List((1, 0),(2, 0),(3, 0)), foo) | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 137 | |
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 138 | |
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 139 | // 1 mark | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 140 | |
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 141 | def tfirst_tour(dim: Int, path: Path): Option[Path] = {
 | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 142 | if (path.length == dim * dim) Some(path) | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 143 | else | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 144 | first(legal_moves(dim, path, path.head), (x:Pos) => tfirst_tour(dim, x::path)) | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 145 | } | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 146 | |
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 147 | def first_tour(dim: Int, path: Path) = | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 148 | time_needed(tfirst_tour(dim: Int, path: Path)) | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 149 | |
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 150 | |
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 151 | /* | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 152 | for (dim <- 1 to 8) {
 | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 153 | val t = first_tour(dim, List((0, 0))) | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 154 |   println(s"${dim} x ${dim} " + (if (t == None) "" else { print_board(dim, t.get) ; "" }))
 | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 155 | } | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 156 | */ | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 157 | |
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 158 | // 15 secs for 8 x 8 | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 159 | //val ts1 = time_needed(0,first_tour(8, List((0, 0))).get) | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 160 | //val ts1 = time_needed(0,first_tour(8, List((1, 1))).get) | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 161 | |
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 162 | // no result for 4 x 4 | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 163 | //val ts2 = time_needed(0, first_tour(4, List((0, 0)))) | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 164 | |
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 165 | // 0.3 secs for 6 x 6 | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 166 | //val ts3 = time_needed(0, first_tour(6, List((0, 0)))) | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 167 | |
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 168 | // 15 secs for 8 x 8 | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 169 | //time_needed(0, print_board(8, first_tour(8, List((0, 0))).get)) | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 170 | |
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 171 | |
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 172 | |
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 173 | |
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 174 | |
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 175 | } | 
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 176 | |
| 
048fc6b70776
added main4 marking
 Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset | 177 |