Do not clone pieces to resolve #2.
parent
17984773d7
commit
85ea0008fa
17
src/main.rs
17
src/main.rs
|
@ -8,7 +8,7 @@ mod tests;
|
|||
use field::Field;
|
||||
use piece::Piece;
|
||||
|
||||
fn solve(field: Field, pieces: Vec<Piece>) -> Option<Field> {
|
||||
fn solve(field: Field, pieces: &mut Vec<Piece>) -> Option<Field> {
|
||||
if field.empty_coords.is_empty() {
|
||||
if pieces.is_empty() {
|
||||
return Some(field);
|
||||
|
@ -20,19 +20,18 @@ fn solve(field: Field, pieces: Vec<Piece>) -> Option<Field> {
|
|||
}
|
||||
|
||||
for empty_coord in &field.empty_coords {
|
||||
for (piece_index, piece) in pieces.iter().enumerate() {
|
||||
for piece_index in 0..pieces.len() {
|
||||
let piece = pieces.remove(piece_index);
|
||||
for pattern in &piece.patterns {
|
||||
if field.fits(&empty_coord, &pattern) {
|
||||
let mut new_field: Field = field.clone();
|
||||
let mut new_pieces = pieces.clone();
|
||||
new_pieces.remove(piece_index);
|
||||
new_field.add_pattern(&empty_coord, &pattern);
|
||||
match solve(new_field, new_pieces) {
|
||||
Some(field) => return Some(field),
|
||||
None => {}
|
||||
if let Some(field) = solve(new_field, pieces) {
|
||||
return Some(field);
|
||||
}
|
||||
}
|
||||
}
|
||||
pieces.insert(piece_index, piece);
|
||||
}
|
||||
}
|
||||
None
|
||||
|
@ -49,7 +48,7 @@ fn main() {
|
|||
// Piece::orange_ricky(), // ___|
|
||||
// Piece::blue_ricky(), // |___
|
||||
// Piece::smashboy(), // o
|
||||
let pieces = vec![
|
||||
let mut pieces = vec![
|
||||
Piece::hero(), // ----
|
||||
Piece::hero(), // ----
|
||||
Piece::smashboy(),
|
||||
|
@ -65,7 +64,7 @@ fn main() {
|
|||
Piece::orange_ricky(), // ___|
|
||||
Piece::blue_ricky(), // |___
|
||||
];
|
||||
let result = solve(field, pieces);
|
||||
let result = solve(field, &mut pieces);
|
||||
match result {
|
||||
Some(field) => println!("{}", field),
|
||||
None => println!("No solution",),
|
||||
|
|
28
src/tests.rs
28
src/tests.rs
|
@ -19,72 +19,72 @@ fn test_add_pattern() {
|
|||
#[test]
|
||||
fn test_solve_no_pieces() {
|
||||
let field = Field::new(5, 5);
|
||||
let pieces = vec![];
|
||||
let result = solve(field, pieces);
|
||||
let mut pieces = vec![];
|
||||
let result = solve(field, &mut pieces);
|
||||
assert!(result.is_none());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_solve_no_space() {
|
||||
let field = Field::new(0, 0);
|
||||
let pieces = vec![Piece::smashboy()];
|
||||
let result = solve(field, pieces);
|
||||
let mut pieces = vec![Piece::smashboy()];
|
||||
let result = solve(field, &mut pieces);
|
||||
assert!(result.is_none());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_solve_base_case() {
|
||||
let field = Field::new(0, 0);
|
||||
let pieces = vec![];
|
||||
let result = solve(field, pieces);
|
||||
let mut pieces = vec![];
|
||||
let result = solve(field, &mut pieces);
|
||||
assert!(result.is_some());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_solve_four_smashboys() {
|
||||
let field = Field::new(4, 4);
|
||||
let pieces = vec![
|
||||
let mut pieces = vec![
|
||||
Piece::smashboy(),
|
||||
Piece::smashboy(),
|
||||
Piece::smashboy(),
|
||||
Piece::smashboy(),
|
||||
];
|
||||
let result = solve(field, pieces);
|
||||
let result = solve(field, &mut pieces);
|
||||
assert!(result.is_some());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_two_two_one() {
|
||||
let field = Field::new(4, 5);
|
||||
let pieces = vec![
|
||||
let mut pieces = vec![
|
||||
Piece::smashboy(),
|
||||
Piece::smashboy(),
|
||||
Piece::blue_ricky(),
|
||||
Piece::blue_ricky(),
|
||||
Piece::hero(),
|
||||
];
|
||||
let result = solve(field, pieces);
|
||||
let result = solve(field, &mut pieces);
|
||||
assert!(result.is_some());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_two_two_one_fail() {
|
||||
let field = Field::new(4, 5);
|
||||
let pieces = vec![
|
||||
let mut pieces = vec![
|
||||
Piece::smashboy(),
|
||||
Piece::smashboy(),
|
||||
Piece::blue_ricky(),
|
||||
Piece::orange_ricky(),
|
||||
Piece::hero(),
|
||||
];
|
||||
let result = solve(field, pieces);
|
||||
let result = solve(field, &mut pieces);
|
||||
assert!(result.is_some());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_eight_seven() {
|
||||
let field = Field::new(8, 7);
|
||||
let pieces = vec![
|
||||
let mut pieces = vec![
|
||||
Piece::hero(), // ----
|
||||
Piece::hero(), // ----
|
||||
Piece::smashboy(),
|
||||
|
@ -100,6 +100,6 @@ fn test_eight_seven() {
|
|||
Piece::orange_ricky(), // ___|
|
||||
Piece::blue_ricky(), // |___
|
||||
];
|
||||
let result = solve(field, pieces);
|
||||
let result = solve(field, &mut pieces);
|
||||
assert!(result.is_some());
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue