Another update from ingydotnet^djgoku

This commit is contained in:
Ingy döt Net 2015-11-18 06:14:39 +00:00
parent 91df62d461
commit 948b86eafa
7604 changed files with 108452 additions and 22726 deletions

View file

@ -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)
}