Another update from ingydotnet^djgoku
This commit is contained in:
parent
91df62d461
commit
948b86eafa
7604 changed files with 108452 additions and 22726 deletions
|
|
@ -1,44 +1,33 @@
|
|||
// rustc 0.10-pre, 24th Feb
|
||||
static side: i8 = 8;
|
||||
static queens: i8 = 8; //change side and queens to modify parameters
|
||||
const N: usize = 8;
|
||||
|
||||
fn place(mut board: [i8,..side*side], ix:i8) -> Option<[i8,..side*side]> {
|
||||
if board[ix] == 0 {
|
||||
return None
|
||||
};
|
||||
board[ix] = -1;
|
||||
let i1 = ix/side;
|
||||
let j1 = ix % side;
|
||||
for k in range(1,side) {
|
||||
let mut loc :i8 = i1 * side + k;
|
||||
board[loc] = 0;
|
||||
loc = k * side + j1;
|
||||
board[loc] = 0;
|
||||
loc = (i1-k) * side + (j1-k);
|
||||
if loc / side == i1 -k && loc % side == j1 - k && loc != ix && loc >= 0 { board[loc] = 0 };
|
||||
loc = loc + 2 * k;
|
||||
if loc / side == i1 - k && loc % side == j1 + k && loc != ix && loc >= 0 { board[loc] = 0};
|
||||
loc = loc + 2 * side * k;
|
||||
if loc / side == i1 + k && loc % side == j1 + k && loc != ix && loc < side*side { board[loc] = 0};
|
||||
loc = loc - 2 * k;
|
||||
if loc / side == i1 + k && loc % side == j1 - k && loc != ix && loc < side*side { board[loc] = 0};
|
||||
}
|
||||
Some(board)
|
||||
}
|
||||
|
||||
fn tryplace(b : [i8,..side*side],ix:i8, nq: i8, mut score: u32) -> u32 {
|
||||
if nq == queens { return score + 1 }
|
||||
for ind in range(ix, side*side) {
|
||||
score = match place(b, ind) {
|
||||
Some(b2) => tryplace(b2, ind+1, nq+1, score),
|
||||
None() => score
|
||||
};
|
||||
}
|
||||
return score
|
||||
fn try(mut board: &mut [[bool; N]; N], row: usize, mut count: &mut i64) {
|
||||
if row == N {
|
||||
*count += 1;
|
||||
for r in board.iter() {
|
||||
println!("{}", r.iter().map(|&x| if x {"x"} else {"."}.to_string()).collect::<Vec<String>>().join(" "))
|
||||
}
|
||||
println!("");
|
||||
return
|
||||
}
|
||||
for i in 0..N {
|
||||
let mut ok: bool = true;
|
||||
for j in 0..row {
|
||||
if board[j][i]
|
||||
|| i+j >= row && board[j][i+j-row]
|
||||
|| i+row < N+j && board[j][i+row-j]
|
||||
{ ok = false }
|
||||
}
|
||||
if ok {
|
||||
board[row][i] = true;
|
||||
try(&mut board, row+1, &mut count);
|
||||
board[row][i] = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let b : [i8, ..side*side] = [1,..side*side];
|
||||
let score = tryplace(b, 0, 0, 0);
|
||||
println!("{}", score)
|
||||
let mut board: [[bool; N]; N] = [[false; N]; N];
|
||||
let mut count: i64 = 0;
|
||||
try (&mut board, 0, &mut count);
|
||||
println!("Found {} solutions", count)
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue