590 |
590 |
591 |
591 |
592 def moves(xs: List[Int], n: Int) : List[List[Int]] = |
592 def moves(xs: List[Int], n: Int) : List[List[Int]] = |
593 (xs, n) match { |
593 (xs, n) match { |
594 case (Nil, _) => Nil |
594 case (Nil, _) => Nil |
595 case (xs, 0) => Nil |
595 case (_, 0) => Nil |
596 case (x::xs, n) => (x::xs) :: moves(xs, n - 1) |
596 case (x::xs, n) => (x::xs) :: moves(xs, n - 1) |
597 } |
597 } |
598 |
598 |
599 |
599 // List(5,5,1,0) -> moves(List(5,1,0), 5) |
600 moves(List(5,1,0), 1) |
600 moves(List(5,1,0), 1) |
601 moves(List(5,1,0), 2) |
601 moves(List(5,1,0), 2) |
602 moves(List(5,1,0), 5) |
602 moves(List(5,1,0), 5) |
603 |
603 |
604 // checks whether a jump tour exists at all |
604 // checks whether a jump tour exists at all |
605 |
605 |
606 def search(xs: List[Int]) : Boolean = xs match { |
606 def search(xs: List[Int]) : Boolean = xs match { |
607 case Nil => true |
607 case Nil => true |
608 case (x::xs) => |
608 case x::xs => |
609 if (xs.length < x) true else moves(xs, x).exists(search(_)) |
609 if (xs.length < x) true |
|
610 else moves(xs, x).exists(search(_)) |
610 } |
611 } |
611 |
612 |
612 |
613 |
613 search(List(5,3,2,5,1,1)) |
614 search(List(5,3,2,5,1,1)) |
614 search(List(3,5,1,0,0,0,1)) |
615 search(List(3,5,1,0,0,0,1)) |
619 search(Nil) |
620 search(Nil) |
620 search(List(1)) |
621 search(List(1)) |
621 search(List(5,1,1)) |
622 search(List(5,1,1)) |
622 search(List(3,5,1,0,0,0,0,0,0,0,0,1)) |
623 search(List(3,5,1,0,0,0,0,0,0,0,0,1)) |
623 |
624 |
|
625 |
|
626 import scala.util._ |
|
627 List.fill(100)(Random.nextInt(2)) |
|
628 search(List.fill(100)(Random.nextInt(10))) |
|
629 |
624 // generate *all* jump tours |
630 // generate *all* jump tours |
625 // if we are only interested in the shortes one, we could |
631 // if we are only interested in the shortes one, we could |
626 // shortcircut the calculation and only return List(x) in |
632 // shortcircut the calculation and only return List(x) in |
627 // case where xs.length < x, because no tour can be shorter |
633 // case where xs.length < x, because no tour can be shorter |
628 // than 1 |
634 // than 1 |
629 // |
635 // |
630 |
636 |
631 def jumps(xs: List[Int]) : List[List[Int]] = xs match { |
637 def jumps(xs: List[Int]) : List[List[Int]] = xs match { |
632 case Nil => Nil |
638 case Nil => Nil |
633 case (x::xs) => { |
639 case x::xs => { |
634 val children = moves(xs, x) |
640 val children = moves(xs, x) |
635 val results = children.map(cs => jumps(cs).map(x :: _)).flatten |
641 val results = |
|
642 children.map(cs => jumps(cs).map(x :: _)).flatten |
636 if (xs.length < x) List(x) :: results else results |
643 if (xs.length < x) List(x) :: results else results |
637 } |
644 } |
638 } |
645 } |
639 |
646 |
640 jumps(List(3,5,1,2,1,2,1)) |
647 jumps(List(3,5,1,2,1,2,1)) |