Add initial conflict resolution
This commit is contained in:
parent
ce3a890237
commit
68d0f64058
3 changed files with 153 additions and 1 deletions
|
|
@ -37,6 +37,10 @@ fn main() {
|
||||||
// b.set_blocked_range(7, 3, 10, 4, true);
|
// b.set_blocked_range(7, 3, 10, 4, true);
|
||||||
|
|
||||||
b.set_blocked_range(3, 2, 10, 3, true);
|
b.set_blocked_range(3, 2, 10, 3, true);
|
||||||
|
b.set_blocked(2, 0, true);
|
||||||
|
b.set_blocked(11, 0, true);
|
||||||
|
b.set_blocked(2, 5, true);
|
||||||
|
b.set_blocked(11, 5, true);
|
||||||
|
|
||||||
let mut b = b.build();
|
let mut b = b.build();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -129,7 +129,7 @@ pub struct Bruteforce {
|
||||||
impl Bruteforce {
|
impl Bruteforce {
|
||||||
pub fn modify_pointer(&self) -> usize {
|
pub fn modify_pointer(&self) -> usize {
|
||||||
self.pointer_stack
|
self.pointer_stack
|
||||||
.get(self.pointer_stack.len() - 2)
|
.get(self.pointer_stack.len().saturating_sub(2))
|
||||||
.copied()
|
.copied()
|
||||||
.unwrap_or(0)
|
.unwrap_or(0)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,4 @@
|
||||||
|
use crate::belt_finding::brute_force::BruteforceBuilder;
|
||||||
use crate::graph::wheighted_graph::shortest_path::dijkstra;
|
use crate::graph::wheighted_graph::shortest_path::dijkstra;
|
||||||
use crate::graph::wheighted_graph::WheightedGraph;
|
use crate::graph::wheighted_graph::WheightedGraph;
|
||||||
use crate::priority_queue::BinaryHeap;
|
use crate::priority_queue::BinaryHeap;
|
||||||
|
|
@ -17,6 +18,21 @@ pub enum Direction {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Direction {
|
impl Direction {
|
||||||
|
fn from_neghbors(pos: &Position, neighbor: &Position) -> Self {
|
||||||
|
let x_diff = pos.x as i64 - neighbor.x as i64;
|
||||||
|
let y_diff = pos.y as i64 - neighbor.y as i64;
|
||||||
|
|
||||||
|
match (x_diff, y_diff) {
|
||||||
|
(1, 0) => Direction::Left,
|
||||||
|
(0, 1) => Direction::Up,
|
||||||
|
(-1, 0) => Direction::Right,
|
||||||
|
(0, -1) => Direction::Down,
|
||||||
|
_ => {
|
||||||
|
unreachable!()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn vertical(&self) -> bool {
|
fn vertical(&self) -> bool {
|
||||||
match self {
|
match self {
|
||||||
Direction::Up => true,
|
Direction::Up => true,
|
||||||
|
|
@ -274,5 +290,137 @@ impl Problem {
|
||||||
self.path[i] = p;
|
self.path[i] = p;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let mut conflicts: Map<usize> = Map::new(self.map.width, self.map.height);
|
||||||
|
|
||||||
|
for x in 0..self.map.width {
|
||||||
|
for y in 0..self.map.height {
|
||||||
|
if self.map.get(x, y).blocked {
|
||||||
|
*conflicts.get_mut(x, y) += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for path in &self.path {
|
||||||
|
for pos in path {
|
||||||
|
*conflicts.get_mut(pos.x, pos.y) += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for y in 0..self.map.height {
|
||||||
|
for x in 0..self.map.width {
|
||||||
|
if *conflicts.get(x, y) > 1 {
|
||||||
|
print!("#");
|
||||||
|
} else {
|
||||||
|
print!(" ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
println!();
|
||||||
|
}
|
||||||
|
|
||||||
|
println!("{self}");
|
||||||
|
|
||||||
|
loop {
|
||||||
|
let mut c = None;
|
||||||
|
for y in 0..self.map.height {
|
||||||
|
for x in 0..self.map.width {
|
||||||
|
if *conflicts.get(x, y) > 1 {
|
||||||
|
c = Some((x, y));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dbg!(c);
|
||||||
|
|
||||||
|
let xoffset = 1;
|
||||||
|
let yoffset = 1;
|
||||||
|
|
||||||
|
if let Some((cx, cy)) = c {
|
||||||
|
*conflicts.get_mut(cx, cy) = 1;
|
||||||
|
|
||||||
|
let xrange = cx..=cx;
|
||||||
|
let yrange = cy..=cy;
|
||||||
|
|
||||||
|
let xrange = xrange.start().saturating_sub(xoffset)
|
||||||
|
..=usize::min(xrange.end() + xoffset, self.map.width - 1);
|
||||||
|
let yrange = yrange.start().saturating_sub(yoffset)
|
||||||
|
..=usize::min(yrange.end() + yoffset, self.map.height - 1);
|
||||||
|
// dbg!(&xrange, &yrange);
|
||||||
|
|
||||||
|
let xsize = xrange.end() - xrange.start() + 1;
|
||||||
|
let ysize = yrange.end() - yrange.start() + 1;
|
||||||
|
|
||||||
|
// dbg!(xsize, ysize);
|
||||||
|
|
||||||
|
let mut b = BruteforceBuilder::new(xsize + 2, ysize + 2);
|
||||||
|
b.set_blocked_range(0, 0, xsize + 1, 0, true);
|
||||||
|
b.set_blocked_range(0, ysize + 1, xsize + 1, ysize + 1, true);
|
||||||
|
b.set_blocked_range(0, 0, 0, ysize + 1, true);
|
||||||
|
b.set_blocked_range(xsize + 1, 0, xsize + 1, ysize + 1, true);
|
||||||
|
|
||||||
|
for x in 0..xsize {
|
||||||
|
for y in 0..ysize {
|
||||||
|
b.set_blocked(
|
||||||
|
x + 1,
|
||||||
|
y + 1,
|
||||||
|
self.map.get(xrange.start() + x, yrange.start() + y).blocked,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for path in &self.path {
|
||||||
|
let s = path
|
||||||
|
.iter()
|
||||||
|
.position(|p| xrange.contains(&p.x) && yrange.contains(&p.y))
|
||||||
|
.map(|i| i.saturating_sub(1));
|
||||||
|
let e = path
|
||||||
|
.iter()
|
||||||
|
.rev()
|
||||||
|
.position(|p| xrange.contains(&p.x) && yrange.contains(&p.y))
|
||||||
|
.map(|i| usize::min(path.len() - 1, path.len() - i));
|
||||||
|
|
||||||
|
if let Some((start, end)) = s.zip(e) {
|
||||||
|
// dbg!(start, end);
|
||||||
|
|
||||||
|
let start_pos = path[start];
|
||||||
|
let start_dir = Direction::from_neghbors(&path[start], &path[start + 1]);
|
||||||
|
let end_pos = path[end];
|
||||||
|
let end_dir = Direction::from_neghbors(&path[end - 1], &path[end]);
|
||||||
|
|
||||||
|
// dbg!(start_pos, end_pos);
|
||||||
|
|
||||||
|
b.add_path(
|
||||||
|
(
|
||||||
|
Position::new(
|
||||||
|
start_pos.x - (xrange.start() - 1),
|
||||||
|
start_pos.y - (yrange.start() - 1),
|
||||||
|
),
|
||||||
|
start_dir,
|
||||||
|
),
|
||||||
|
(
|
||||||
|
Position::new(
|
||||||
|
end_pos.x - (xrange.start() - 1),
|
||||||
|
end_pos.y - (yrange.start() - 1),
|
||||||
|
),
|
||||||
|
end_dir,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut b = b.build();
|
||||||
|
|
||||||
|
println!("{}", b);
|
||||||
|
|
||||||
|
while b.next_finish_state() {
|
||||||
|
println!("{}", b);
|
||||||
|
}
|
||||||
|
|
||||||
|
println!("{}", b.solution_count());
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue