domino_lib/utils/graphs/
get_missing_tiles.rs

1use 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}