@@ -21,48 +21,51 @@ class QueensSuite extends FunSuite {
21
21
busyColumns: Set [Int ],
22
22
busyLRDiagonals: Set [Int ],
23
23
busyRLDiagonals: Set [Int ],
24
- queens : Set [(Int ,Int )]
24
+ queens : Vector [(Int ,Int )]
25
25
);
26
26
27
27
val N = 8
28
28
29
29
def putQueen (state: State ): ReadChannel [Future ,State ] =
30
30
val ch = makeChannel[State ]()
31
31
async[Future ] {
32
- for {
33
- i <- 0 until N if ! state.busyRows.contains(i)
34
- j <- 0 until N if ! state.busyColumns.contains(j) &&
32
+ val i = state.queens.length
33
+ if i < N then
34
+ for {
35
+ j <- 0 until N if ! state.busyColumns.contains(j) &&
35
36
! state.busyLRDiagonals.contains(i- j) &&
36
37
! state.busyRLDiagonals.contains(i+ j)
37
- } {
38
- val newPos = (i,j)
39
- val nState = state.copy( busyRows = state.busyRows + i,
38
+ } {
39
+ val newPos = (i,j)
40
+ val nState = state.copy( busyRows = state.busyRows + i,
40
41
busyColumns = state.busyColumns + j,
41
42
busyLRDiagonals = state.busyLRDiagonals + (i- j),
42
43
busyRLDiagonals = state.busyRLDiagonals + (i+ j),
43
- queens = state.queens + newPos )
44
- ch.write(nState)
45
- }
44
+ queens = state.queens : + newPos )
45
+ ch.write(nState)
46
+ }
46
47
ch.close()
47
48
}
48
49
ch
49
50
50
51
def solutions (state : State ): ReadChannel [Future ,State ] =
51
52
async[[X ] =>> ReadChannel [Future ,X ]] {
52
- if (state.queens.size < 8 ) then
53
+ if (state.queens.size < N ) then
54
+ // println("state:"+state.queens)
53
55
val nextState = await(putQueen(state))
56
+ // println("next-state:"+state.queens)
54
57
await(solutions(nextState))
55
58
else
56
59
state
57
60
}
58
61
59
- val emptyState = State (Set .empty, Set .empty, Set .empty, Set .empty, Set .empty)
62
+ val emptyState = State (Set .empty, Set .empty, Set .empty, Set .empty, Vector .empty)
60
63
61
- test(" first solution for 8 queens problem" ) {
64
+ test(" two first solution for 8 queens problem" ) {
62
65
async[Future ] {
63
- val r = solutions(emptyState).take(1 )
66
+ val r = solutions(emptyState).take(2 )
64
67
assert(! r.isEmpty)
65
- println(r.head .queens)
68
+ println(r.map(_ .queens) )
66
69
}
67
70
}
68
71
0 commit comments