day12 part1
This commit is contained in:
parent
80e57358e5
commit
724572d5be
1 changed files with 22 additions and 34 deletions
|
@ -1,4 +1,4 @@
|
||||||
use std::collections::{HashMap, HashSet, VecDeque};
|
use std::collections::{HashSet, VecDeque};
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let input = std::fs::read_to_string("input").unwrap();
|
let input = std::fs::read_to_string("input").unwrap();
|
||||||
|
@ -7,54 +7,45 @@ fn main() {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn pt1(grid: &Garden) -> usize {
|
fn pt1(grid: &Garden) -> usize {
|
||||||
|
let mut visited = HashSet::new();
|
||||||
let mut cost = 0;
|
let mut cost = 0;
|
||||||
let regions = regions(grid);
|
|
||||||
println!("there are {} regions", regions.len());
|
|
||||||
for (_root, region) in regions {
|
|
||||||
let a = region.len();
|
|
||||||
let mut p = 0;
|
|
||||||
for plot in region {
|
|
||||||
p += plot.p_val;
|
|
||||||
}
|
|
||||||
cost += a * p;
|
|
||||||
}
|
|
||||||
|
|
||||||
cost
|
|
||||||
}
|
|
||||||
|
|
||||||
fn regions(grid: &Garden) -> Regions {
|
|
||||||
let mut out = Regions::new();
|
|
||||||
let mut knowns = HashSet::new();
|
|
||||||
|
|
||||||
for row in grid.rows.iter() {
|
for row in grid.rows.iter() {
|
||||||
for plot in row.iter() {
|
for plot in row.iter() {
|
||||||
let root = plot.loc;
|
let root = plot.loc;
|
||||||
let mut q = VecDeque::new();
|
if visited.contains(&root) {
|
||||||
if !knowns.contains(&root) {
|
|
||||||
q.push_back(root);
|
|
||||||
} else {
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
let mut q = VecDeque::new();
|
||||||
|
q.push_back(root);
|
||||||
let mut region = HashSet::new();
|
let mut region = HashSet::new();
|
||||||
|
let mut visiting = HashSet::new();
|
||||||
while let Some(current) = q.pop_front() {
|
while let Some(current) = q.pop_front() {
|
||||||
knowns.insert(current);
|
visited.insert(current);
|
||||||
|
visiting.remove(¤t);
|
||||||
let nexts = grid.neighbors(¤t);
|
let nexts = grid.neighbors(¤t);
|
||||||
for next in nexts
|
for next in nexts
|
||||||
.iter()
|
.iter()
|
||||||
.map(|n| grid.get(n).unwrap())
|
.map(|n| grid.get(n).unwrap())
|
||||||
.filter(|n| !region.contains(n))
|
.filter(|n| !region.contains(n))
|
||||||
{
|
{
|
||||||
q.push_back(next.loc);
|
if !visiting.contains(&next.loc) {
|
||||||
|
q.push_back(next.loc);
|
||||||
|
visiting.insert(next.loc);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
region.insert(grid.get(¤t).unwrap());
|
region.insert(grid.get(¤t).unwrap());
|
||||||
}
|
}
|
||||||
let _ = out.entry(root).or_insert(region);
|
let a = region.len();
|
||||||
|
let mut p = 0;
|
||||||
|
for plot in region {
|
||||||
|
p += plot.p_val;
|
||||||
|
}
|
||||||
|
cost += a * p;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
out
|
|
||||||
}
|
|
||||||
|
|
||||||
type Regions<'g> = HashMap<Loc, HashSet<&'g Plot>>;
|
cost
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
struct Garden {
|
struct Garden {
|
||||||
|
@ -82,14 +73,11 @@ impl Garden {
|
||||||
let cols = g.rows[0].len();
|
let cols = g.rows[0].len();
|
||||||
for row in 0..rows {
|
for row in 0..rows {
|
||||||
for col in 0..cols {
|
for col in 0..cols {
|
||||||
let mut plot = g.rows[row][col];
|
|
||||||
let mut p = 4;
|
let mut p = 4;
|
||||||
let loc = plot.loc;
|
for _ in g.neighbors(&Loc { row, col }) {
|
||||||
for _ in g.neighbors(&loc) {
|
|
||||||
p -= 1;
|
p -= 1;
|
||||||
}
|
}
|
||||||
plot.p_val = p;
|
g.rows[row][col].p_val = p;
|
||||||
g.rows[row][col] = plot;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
g
|
g
|
||||||
|
|
Loading…
Reference in a new issue