Do not clone pieces to resolve #2.
This commit is contained in:
17
src/main.rs
17
src/main.rs
@@ -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",),
|
||||||
|
|||||||
28
src/tests.rs
28
src/tests.rs
@@ -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());
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user