domino_lib/utils/graphs/
get_missing_tiles.rs1use std::collections::HashSet;
2
3use crate::utils::{get_n, DominoError, Puzzle, Tile};
4
5pub fn get_missing_tiles(puzzle: &Puzzle) -> Result<HashSet<Tile>, DominoError> {
6 let n = get_n(puzzle)?;
7 let tileset: HashSet<Tile> = (0..(n + 1))
8 .map(|i| ((0)..(n + 1)).map(|j| Tile(i, j)).collect::<Vec<Tile>>())
9 .flatten()
10 .filter(|tile| {
11 if n % 2 == 0 {
12 true
13 } else {
14 (tile.0 - tile.1).abs() as i32 != ((n as i32 + 1) / 2)
15 }
16 })
17 .collect();
18 let used_tiles: HashSet<Tile> = puzzle
19 .iter()
20 .filter_map(|tile| {
21 if tile.is_some() {
22 Some(vec![tile.unwrap().clone(), tile.unwrap().flip()])
23 } else {
24 None
25 }
26 })
27 .flatten()
28 .collect();
29 let missing_tiles: HashSet<Tile> = tileset.difference(&used_tiles).cloned().collect();
30 Ok(missing_tiles)
31}