Do not clone pieces to resolve #2.

This commit is contained in:
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 field::Field;
use piece::Piece; 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 field.empty_coords.is_empty() {
if pieces.is_empty() { if pieces.is_empty() {
return Some(field); return Some(field);
@@ -20,19 +20,18 @@ fn solve(field: Field, pieces: Vec<Piece>) -> Option<Field> {
} }
for empty_coord in &field.empty_coords { 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 { for pattern in &piece.patterns {
if field.fits(&empty_coord, &pattern) { if field.fits(&empty_coord, &pattern) {
let mut new_field: Field = field.clone(); 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); new_field.add_pattern(&empty_coord, &pattern);
match solve(new_field, new_pieces) { if let Some(field) = solve(new_field, pieces) {
Some(field) => return Some(field), return Some(field);
None => {}
} }
} }
} }
pieces.insert(piece_index, piece);
} }
} }
None None
@@ -49,7 +48,7 @@ fn main() {
// Piece::orange_ricky(), // ___| // Piece::orange_ricky(), // ___|
// Piece::blue_ricky(), // |___ // Piece::blue_ricky(), // |___
// Piece::smashboy(), // o // Piece::smashboy(), // o
let pieces = vec![ let mut pieces = vec![
Piece::hero(), // ---- Piece::hero(), // ----
Piece::hero(), // ---- Piece::hero(), // ----
Piece::smashboy(), Piece::smashboy(),
@@ -65,7 +64,7 @@ fn main() {
Piece::orange_ricky(), // ___| Piece::orange_ricky(), // ___|
Piece::blue_ricky(), // |___ Piece::blue_ricky(), // |___
]; ];
let result = solve(field, pieces); let result = solve(field, &mut pieces);
match result { match result {
Some(field) => println!("{}", field), Some(field) => println!("{}", field),
None => println!("No solution",), None => println!("No solution",),

View File

@@ -19,72 +19,72 @@ fn test_add_pattern() {
#[test] #[test]
fn test_solve_no_pieces() { fn test_solve_no_pieces() {
let field = Field::new(5, 5); let field = Field::new(5, 5);
let pieces = vec![]; let mut pieces = vec![];
let result = solve(field, pieces); let result = solve(field, &mut pieces);
assert!(result.is_none()); assert!(result.is_none());
} }
#[test] #[test]
fn test_solve_no_space() { fn test_solve_no_space() {
let field = Field::new(0, 0); let field = Field::new(0, 0);
let pieces = vec![Piece::smashboy()]; let mut pieces = vec![Piece::smashboy()];
let result = solve(field, pieces); let result = solve(field, &mut pieces);
assert!(result.is_none()); assert!(result.is_none());
} }
#[test] #[test]
fn test_solve_base_case() { fn test_solve_base_case() {
let field = Field::new(0, 0); let field = Field::new(0, 0);
let pieces = vec![]; let mut pieces = vec![];
let result = solve(field, pieces); let result = solve(field, &mut pieces);
assert!(result.is_some()); assert!(result.is_some());
} }
#[test] #[test]
fn test_solve_four_smashboys() { fn test_solve_four_smashboys() {
let field = Field::new(4, 4); let field = Field::new(4, 4);
let pieces = vec![ let mut pieces = vec![
Piece::smashboy(), Piece::smashboy(),
Piece::smashboy(), Piece::smashboy(),
Piece::smashboy(), Piece::smashboy(),
Piece::smashboy(), Piece::smashboy(),
]; ];
let result = solve(field, pieces); let result = solve(field, &mut pieces);
assert!(result.is_some()); assert!(result.is_some());
} }
#[test] #[test]
fn test_two_two_one() { fn test_two_two_one() {
let field = Field::new(4, 5); let field = Field::new(4, 5);
let pieces = vec![ let mut pieces = vec![
Piece::smashboy(), Piece::smashboy(),
Piece::smashboy(), Piece::smashboy(),
Piece::blue_ricky(), Piece::blue_ricky(),
Piece::blue_ricky(), Piece::blue_ricky(),
Piece::hero(), Piece::hero(),
]; ];
let result = solve(field, pieces); let result = solve(field, &mut pieces);
assert!(result.is_some()); assert!(result.is_some());
} }
#[test] #[test]
fn test_two_two_one_fail() { fn test_two_two_one_fail() {
let field = Field::new(4, 5); let field = Field::new(4, 5);
let pieces = vec![ let mut pieces = vec![
Piece::smashboy(), Piece::smashboy(),
Piece::smashboy(), Piece::smashboy(),
Piece::blue_ricky(), Piece::blue_ricky(),
Piece::orange_ricky(), Piece::orange_ricky(),
Piece::hero(), Piece::hero(),
]; ];
let result = solve(field, pieces); let result = solve(field, &mut pieces);
assert!(result.is_some()); assert!(result.is_some());
} }
#[test] #[test]
fn test_eight_seven() { fn test_eight_seven() {
let field = Field::new(8, 7); let field = Field::new(8, 7);
let pieces = vec![ let mut pieces = vec![
Piece::hero(), // ---- Piece::hero(), // ----
Piece::hero(), // ---- Piece::hero(), // ----
Piece::smashboy(), Piece::smashboy(),
@@ -100,6 +100,6 @@ fn test_eight_seven() {
Piece::orange_ricky(), // ___| Piece::orange_ricky(), // ___|
Piece::blue_ricky(), // |___ Piece::blue_ricky(), // |___
]; ];
let result = solve(field, pieces); let result = solve(field, &mut pieces);
assert!(result.is_some()); assert!(result.is_some());
} }