Do not clone pieces to resolve #2.

main
felixm 2023-10-19 14:52:21 +02:00
parent 17984773d7
commit 85ea0008fa
2 changed files with 22 additions and 23 deletions

View File

@ -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",),

View File

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