Skip to content

Commit 947b58e

Browse files
committed
p773
1 parent 82d80e5 commit 947b58e

File tree

1 file changed

+70
-0
lines changed

1 file changed

+70
-0
lines changed

src/p773.rs

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
use std::collections::HashSet;
2+
3+
pub fn run() {
4+
for i in [
5+
vec![vec![1,2,3], vec![4,0,5]],
6+
vec![vec![4,1,2], vec![5,0,3]],
7+
vec![vec![1,2,3],vec![5,4,0]]
8+
] {
9+
println!("{}", sliding_puzzle(i));
10+
}
11+
}
12+
13+
pub fn sliding_puzzle(board: Vec<Vec<i32>>) -> i32 {
14+
if board == vec![vec![1,2,3], vec![4,5,0]] {
15+
return 0;
16+
}
17+
18+
let board: Vec<i32> = board.iter().flatten().map(|x| *x).collect();
19+
let mut set: HashSet<Vec<i32>> = HashSet::new();
20+
set.insert(board.clone());
21+
22+
let target = vec![1,2,3,4,5,0];
23+
let mut nodes: Vec<Vec<i32>> = vec![board];
24+
let mut count = 0;
25+
loop {
26+
count += 1;
27+
28+
let mut result: Vec<Vec<i32>> = vec![];
29+
let mut flag = false;
30+
for i in nodes.clone() {
31+
for m in perform_all_moves(&i) {
32+
if !set.insert(m.clone()) {
33+
continue;
34+
}
35+
if m == target {
36+
return count;
37+
}
38+
flag = true;
39+
result.push(m);
40+
}
41+
}
42+
43+
if !flag {
44+
// no changes to all nodes, means no possible moves
45+
return -1;
46+
}
47+
nodes = result.clone();
48+
}
49+
}
50+
51+
pub fn perform_all_moves(n: &Vec<i32>) -> Vec<Vec<i32>> {
52+
// 4 moves -> u,r,d,
53+
54+
let index = n.iter().position(|x| *x == 0).unwrap();
55+
56+
let possible_swaps = vec![
57+
vec![1, 3], vec![0, 2, 4], vec![1, 5], vec![0, 4], vec![1, 3, 5], vec![2, 4]
58+
];
59+
60+
let mut result = vec![];
61+
for s in &possible_swaps[index] {
62+
let mut t = n.clone();
63+
t[index] = t[*s as usize];
64+
t[*s as usize] = 0;
65+
66+
result.push(t);
67+
}
68+
69+
result
70+
}

0 commit comments

Comments
 (0)