Add solution
This commit is contained in:
parent
915b486dc1
commit
780e817337
5 changed files with 1047 additions and 0 deletions
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
/target
|
||||||
16
Cargo.lock
generated
Normal file
16
Cargo.lock
generated
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
# This file is automatically @generated by Cargo.
|
||||||
|
# It is not intended for manual editing.
|
||||||
|
version = 3
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "laulens_move"
|
||||||
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
|
"smallvec",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "smallvec"
|
||||||
|
version = "1.13.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67"
|
||||||
7
Cargo.toml
Normal file
7
Cargo.toml
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
[package]
|
||||||
|
name = "laulens_move"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
smallvec = "1.13.2"
|
||||||
678
out.txt
Normal file
678
out.txt
Normal file
|
|
@ -0,0 +1,678 @@
|
||||||
|
11022
|
||||||
|
33456
|
||||||
|
33478
|
||||||
|
990aa
|
||||||
|
|
||||||
|
Move: 4 Up
|
||||||
|
11422
|
||||||
|
33456
|
||||||
|
33078
|
||||||
|
990aa
|
||||||
|
|
||||||
|
Move: 7 Left
|
||||||
|
11422
|
||||||
|
33456
|
||||||
|
33708
|
||||||
|
990aa
|
||||||
|
|
||||||
|
Move: 7 Down
|
||||||
|
11422
|
||||||
|
33456
|
||||||
|
33008
|
||||||
|
997aa
|
||||||
|
|
||||||
|
Move: 4 Down
|
||||||
|
11022
|
||||||
|
33456
|
||||||
|
33408
|
||||||
|
997aa
|
||||||
|
|
||||||
|
Move: 2 Left
|
||||||
|
11220
|
||||||
|
33456
|
||||||
|
33408
|
||||||
|
997aa
|
||||||
|
|
||||||
|
Move: 6 Up
|
||||||
|
11226
|
||||||
|
33450
|
||||||
|
33408
|
||||||
|
997aa
|
||||||
|
|
||||||
|
Move: 8 Up
|
||||||
|
11226
|
||||||
|
33458
|
||||||
|
33400
|
||||||
|
997aa
|
||||||
|
|
||||||
|
Move: 10 Up
|
||||||
|
11226
|
||||||
|
33458
|
||||||
|
334aa
|
||||||
|
99700
|
||||||
|
|
||||||
|
Move: 7 Right
|
||||||
|
11226
|
||||||
|
33458
|
||||||
|
334aa
|
||||||
|
99070
|
||||||
|
|
||||||
|
Move: 4 Down
|
||||||
|
11226
|
||||||
|
33058
|
||||||
|
334aa
|
||||||
|
99470
|
||||||
|
|
||||||
|
Move: 5 Left
|
||||||
|
11226
|
||||||
|
33508
|
||||||
|
334aa
|
||||||
|
99470
|
||||||
|
|
||||||
|
Move: 7 Right
|
||||||
|
11226
|
||||||
|
33508
|
||||||
|
334aa
|
||||||
|
99407
|
||||||
|
|
||||||
|
Move: 8 Left
|
||||||
|
11226
|
||||||
|
33580
|
||||||
|
334aa
|
||||||
|
99407
|
||||||
|
|
||||||
|
Move: 6 Down
|
||||||
|
11220
|
||||||
|
33586
|
||||||
|
334aa
|
||||||
|
99407
|
||||||
|
|
||||||
|
Move: 2 Right
|
||||||
|
11022
|
||||||
|
33586
|
||||||
|
334aa
|
||||||
|
99407
|
||||||
|
|
||||||
|
Move: 5 Up
|
||||||
|
11522
|
||||||
|
33086
|
||||||
|
334aa
|
||||||
|
99407
|
||||||
|
|
||||||
|
Move: 4 Up
|
||||||
|
11522
|
||||||
|
33486
|
||||||
|
334aa
|
||||||
|
99007
|
||||||
|
|
||||||
|
Move: 9 Right
|
||||||
|
11522
|
||||||
|
33486
|
||||||
|
334aa
|
||||||
|
09907
|
||||||
|
|
||||||
|
Move: 9 Right
|
||||||
|
11522
|
||||||
|
33486
|
||||||
|
334aa
|
||||||
|
00997
|
||||||
|
|
||||||
|
Move: 3 Down
|
||||||
|
11522
|
||||||
|
00486
|
||||||
|
334aa
|
||||||
|
33997
|
||||||
|
|
||||||
|
Move: 1 Down
|
||||||
|
00522
|
||||||
|
11486
|
||||||
|
334aa
|
||||||
|
33997
|
||||||
|
|
||||||
|
Move: 5 Left
|
||||||
|
05022
|
||||||
|
11486
|
||||||
|
334aa
|
||||||
|
33997
|
||||||
|
|
||||||
|
Move: 2 Left
|
||||||
|
05220
|
||||||
|
11486
|
||||||
|
334aa
|
||||||
|
33997
|
||||||
|
|
||||||
|
Move: 5 Left
|
||||||
|
50220
|
||||||
|
11486
|
||||||
|
334aa
|
||||||
|
33997
|
||||||
|
|
||||||
|
Move: 2 Left
|
||||||
|
52200
|
||||||
|
11486
|
||||||
|
334aa
|
||||||
|
33997
|
||||||
|
|
||||||
|
Move: 6 Up
|
||||||
|
52206
|
||||||
|
11480
|
||||||
|
334aa
|
||||||
|
33997
|
||||||
|
|
||||||
|
Move: 8 Up
|
||||||
|
52286
|
||||||
|
11400
|
||||||
|
334aa
|
||||||
|
33997
|
||||||
|
|
||||||
|
Move: 10 Up
|
||||||
|
52286
|
||||||
|
114aa
|
||||||
|
33400
|
||||||
|
33997
|
||||||
|
|
||||||
|
Move: 7 Up
|
||||||
|
52286
|
||||||
|
114aa
|
||||||
|
33407
|
||||||
|
33990
|
||||||
|
|
||||||
|
Move: 7 Left
|
||||||
|
52286
|
||||||
|
114aa
|
||||||
|
33470
|
||||||
|
33990
|
||||||
|
|
||||||
|
Move: 9 Right
|
||||||
|
52286
|
||||||
|
114aa
|
||||||
|
33470
|
||||||
|
33099
|
||||||
|
|
||||||
|
Move: 4 Down
|
||||||
|
52286
|
||||||
|
110aa
|
||||||
|
33470
|
||||||
|
33499
|
||||||
|
|
||||||
|
Move: 10 Left
|
||||||
|
52286
|
||||||
|
11aa0
|
||||||
|
33470
|
||||||
|
33499
|
||||||
|
|
||||||
|
Move: 6 Down
|
||||||
|
52280
|
||||||
|
11aa6
|
||||||
|
33470
|
||||||
|
33499
|
||||||
|
|
||||||
|
Move: 6 Down
|
||||||
|
52280
|
||||||
|
11aa0
|
||||||
|
33476
|
||||||
|
33499
|
||||||
|
|
||||||
|
Move: 10 Right
|
||||||
|
52280
|
||||||
|
110aa
|
||||||
|
33476
|
||||||
|
33499
|
||||||
|
|
||||||
|
Move: 1 Right
|
||||||
|
52280
|
||||||
|
011aa
|
||||||
|
33476
|
||||||
|
33499
|
||||||
|
|
||||||
|
Move: 5 Down
|
||||||
|
02280
|
||||||
|
511aa
|
||||||
|
33476
|
||||||
|
33499
|
||||||
|
|
||||||
|
Move: 2 Left
|
||||||
|
22080
|
||||||
|
511aa
|
||||||
|
33476
|
||||||
|
33499
|
||||||
|
|
||||||
|
Move: 8 Left
|
||||||
|
22800
|
||||||
|
511aa
|
||||||
|
33476
|
||||||
|
33499
|
||||||
|
|
||||||
|
Move: 10 Up
|
||||||
|
228aa
|
||||||
|
51100
|
||||||
|
33476
|
||||||
|
33499
|
||||||
|
|
||||||
|
Move: 1 Right
|
||||||
|
228aa
|
||||||
|
50110
|
||||||
|
33476
|
||||||
|
33499
|
||||||
|
|
||||||
|
Move: 1 Right
|
||||||
|
228aa
|
||||||
|
50011
|
||||||
|
33476
|
||||||
|
33499
|
||||||
|
|
||||||
|
Move: 8 Down
|
||||||
|
220aa
|
||||||
|
50811
|
||||||
|
33476
|
||||||
|
33499
|
||||||
|
|
||||||
|
Move: 8 Left
|
||||||
|
220aa
|
||||||
|
58011
|
||||||
|
33476
|
||||||
|
33499
|
||||||
|
|
||||||
|
Move: 4 Up
|
||||||
|
220aa
|
||||||
|
58411
|
||||||
|
33476
|
||||||
|
33099
|
||||||
|
|
||||||
|
Move: 4 Up
|
||||||
|
224aa
|
||||||
|
58411
|
||||||
|
33076
|
||||||
|
33099
|
||||||
|
|
||||||
|
Move: 9 Left
|
||||||
|
224aa
|
||||||
|
58411
|
||||||
|
33076
|
||||||
|
33990
|
||||||
|
|
||||||
|
Move: 6 Down
|
||||||
|
224aa
|
||||||
|
58411
|
||||||
|
33070
|
||||||
|
33996
|
||||||
|
|
||||||
|
Move: 7 Right
|
||||||
|
224aa
|
||||||
|
58411
|
||||||
|
33007
|
||||||
|
33996
|
||||||
|
|
||||||
|
Move: 9 Up
|
||||||
|
224aa
|
||||||
|
58411
|
||||||
|
33997
|
||||||
|
33006
|
||||||
|
|
||||||
|
Move: 6 Left
|
||||||
|
224aa
|
||||||
|
58411
|
||||||
|
33997
|
||||||
|
33060
|
||||||
|
|
||||||
|
Move: 7 Down
|
||||||
|
224aa
|
||||||
|
58411
|
||||||
|
33990
|
||||||
|
33067
|
||||||
|
|
||||||
|
Move: 9 Right
|
||||||
|
224aa
|
||||||
|
58411
|
||||||
|
33099
|
||||||
|
33067
|
||||||
|
|
||||||
|
Move: 4 Down
|
||||||
|
220aa
|
||||||
|
58411
|
||||||
|
33499
|
||||||
|
33067
|
||||||
|
|
||||||
|
Move: 2 Right
|
||||||
|
022aa
|
||||||
|
58411
|
||||||
|
33499
|
||||||
|
33067
|
||||||
|
|
||||||
|
Move: 4 Down
|
||||||
|
022aa
|
||||||
|
58011
|
||||||
|
33499
|
||||||
|
33467
|
||||||
|
|
||||||
|
Move: 1 Left
|
||||||
|
022aa
|
||||||
|
58110
|
||||||
|
33499
|
||||||
|
33467
|
||||||
|
|
||||||
|
Move: 5 Up
|
||||||
|
522aa
|
||||||
|
08110
|
||||||
|
33499
|
||||||
|
33467
|
||||||
|
|
||||||
|
Move: 8 Left
|
||||||
|
522aa
|
||||||
|
80110
|
||||||
|
33499
|
||||||
|
33467
|
||||||
|
|
||||||
|
Move: 1 Left
|
||||||
|
522aa
|
||||||
|
81100
|
||||||
|
33499
|
||||||
|
33467
|
||||||
|
|
||||||
|
Move: 9 Up
|
||||||
|
522aa
|
||||||
|
81199
|
||||||
|
33400
|
||||||
|
33467
|
||||||
|
|
||||||
|
Move: 6 Up
|
||||||
|
522aa
|
||||||
|
81199
|
||||||
|
33460
|
||||||
|
33407
|
||||||
|
|
||||||
|
Move: 6 Right
|
||||||
|
522aa
|
||||||
|
81199
|
||||||
|
33406
|
||||||
|
33407
|
||||||
|
|
||||||
|
Move: 4 Right
|
||||||
|
522aa
|
||||||
|
81199
|
||||||
|
33046
|
||||||
|
33047
|
||||||
|
|
||||||
|
Move: 3 Right
|
||||||
|
522aa
|
||||||
|
81199
|
||||||
|
03346
|
||||||
|
03347
|
||||||
|
|
||||||
|
Move: 8 Down
|
||||||
|
522aa
|
||||||
|
01199
|
||||||
|
83346
|
||||||
|
03347
|
||||||
|
|
||||||
|
Move: 5 Down
|
||||||
|
022aa
|
||||||
|
51199
|
||||||
|
83346
|
||||||
|
03347
|
||||||
|
|
||||||
|
Move: 2 Left
|
||||||
|
220aa
|
||||||
|
51199
|
||||||
|
83346
|
||||||
|
03347
|
||||||
|
|
||||||
|
Move: 8 Down
|
||||||
|
220aa
|
||||||
|
51199
|
||||||
|
03346
|
||||||
|
83347
|
||||||
|
|
||||||
|
Move: 5 Down
|
||||||
|
220aa
|
||||||
|
01199
|
||||||
|
53346
|
||||||
|
83347
|
||||||
|
|
||||||
|
Move: 1 Left
|
||||||
|
220aa
|
||||||
|
11099
|
||||||
|
53346
|
||||||
|
83347
|
||||||
|
|
||||||
|
Move: 9 Left
|
||||||
|
220aa
|
||||||
|
11990
|
||||||
|
53346
|
||||||
|
83347
|
||||||
|
|
||||||
|
Move: 6 Up
|
||||||
|
220aa
|
||||||
|
11996
|
||||||
|
53340
|
||||||
|
83347
|
||||||
|
|
||||||
|
Move: 7 Up
|
||||||
|
220aa
|
||||||
|
11996
|
||||||
|
53347
|
||||||
|
83340
|
||||||
|
|
||||||
|
Move: 10 Left
|
||||||
|
22aa0
|
||||||
|
11996
|
||||||
|
53347
|
||||||
|
83340
|
||||||
|
|
||||||
|
Move: 6 Up
|
||||||
|
22aa6
|
||||||
|
11990
|
||||||
|
53347
|
||||||
|
83340
|
||||||
|
|
||||||
|
Move: 7 Up
|
||||||
|
22aa6
|
||||||
|
11997
|
||||||
|
53340
|
||||||
|
83340
|
||||||
|
|
||||||
|
Move: 4 Right
|
||||||
|
22aa6
|
||||||
|
11997
|
||||||
|
53304
|
||||||
|
83304
|
||||||
|
|
||||||
|
Move: 3 Right
|
||||||
|
22aa6
|
||||||
|
11997
|
||||||
|
50334
|
||||||
|
80334
|
||||||
|
|
||||||
|
Move: 5 Right
|
||||||
|
22aa6
|
||||||
|
11997
|
||||||
|
05334
|
||||||
|
80334
|
||||||
|
|
||||||
|
Move: 5 Down
|
||||||
|
22aa6
|
||||||
|
11997
|
||||||
|
00334
|
||||||
|
85334
|
||||||
|
|
||||||
|
Move: 1 Down
|
||||||
|
22aa6
|
||||||
|
00997
|
||||||
|
11334
|
||||||
|
85334
|
||||||
|
|
||||||
|
Move: 9 Left
|
||||||
|
22aa6
|
||||||
|
09907
|
||||||
|
11334
|
||||||
|
85334
|
||||||
|
|
||||||
|
Move: 9 Left
|
||||||
|
22aa6
|
||||||
|
99007
|
||||||
|
11334
|
||||||
|
85334
|
||||||
|
|
||||||
|
Move: 3 Up
|
||||||
|
22aa6
|
||||||
|
99337
|
||||||
|
11334
|
||||||
|
85004
|
||||||
|
|
||||||
|
Move: 5 Right
|
||||||
|
22aa6
|
||||||
|
99337
|
||||||
|
11334
|
||||||
|
80504
|
||||||
|
|
||||||
|
Move: 5 Right
|
||||||
|
22aa6
|
||||||
|
99337
|
||||||
|
11334
|
||||||
|
80054
|
||||||
|
|
||||||
|
Move: 8 Right
|
||||||
|
22aa6
|
||||||
|
99337
|
||||||
|
11334
|
||||||
|
08054
|
||||||
|
|
||||||
|
Move: 8 Right
|
||||||
|
22aa6
|
||||||
|
99337
|
||||||
|
11334
|
||||||
|
00854
|
||||||
|
|
||||||
|
Move: 1 Down
|
||||||
|
22aa6
|
||||||
|
99337
|
||||||
|
00334
|
||||||
|
11854
|
||||||
|
|
||||||
|
Move: 9 Down
|
||||||
|
22aa6
|
||||||
|
00337
|
||||||
|
99334
|
||||||
|
11854
|
||||||
|
|
||||||
|
Move: 2 Down
|
||||||
|
00aa6
|
||||||
|
22337
|
||||||
|
99334
|
||||||
|
11854
|
||||||
|
|
||||||
|
Move: 10 Left
|
||||||
|
0aa06
|
||||||
|
22337
|
||||||
|
99334
|
||||||
|
11854
|
||||||
|
|
||||||
|
Move: 10 Left
|
||||||
|
aa006
|
||||||
|
22337
|
||||||
|
99334
|
||||||
|
11854
|
||||||
|
|
||||||
|
Move: 3 Up
|
||||||
|
aa336
|
||||||
|
22337
|
||||||
|
99004
|
||||||
|
11854
|
||||||
|
|
||||||
|
Move: 5 Up
|
||||||
|
aa336
|
||||||
|
22337
|
||||||
|
99054
|
||||||
|
11804
|
||||||
|
|
||||||
|
Move: 5 Left
|
||||||
|
aa336
|
||||||
|
22337
|
||||||
|
99504
|
||||||
|
11804
|
||||||
|
|
||||||
|
Move: 4 Left
|
||||||
|
aa336
|
||||||
|
22337
|
||||||
|
99540
|
||||||
|
11840
|
||||||
|
|
||||||
|
Move: 7 Down
|
||||||
|
aa336
|
||||||
|
22330
|
||||||
|
99547
|
||||||
|
11840
|
||||||
|
|
||||||
|
Move: 6 Down
|
||||||
|
aa330
|
||||||
|
22336
|
||||||
|
99547
|
||||||
|
11840
|
||||||
|
|
||||||
|
Move: 7 Down
|
||||||
|
aa330
|
||||||
|
22336
|
||||||
|
99540
|
||||||
|
11847
|
||||||
|
|
||||||
|
Move: 6 Down
|
||||||
|
aa330
|
||||||
|
22330
|
||||||
|
99546
|
||||||
|
11847
|
||||||
|
|
||||||
|
Move: 3 Right
|
||||||
|
aa033
|
||||||
|
22033
|
||||||
|
99546
|
||||||
|
11847
|
||||||
|
|
||||||
|
Move: 5 Up
|
||||||
|
aa033
|
||||||
|
22533
|
||||||
|
99046
|
||||||
|
11847
|
||||||
|
|
||||||
|
Move: 5 Up
|
||||||
|
aa533
|
||||||
|
22033
|
||||||
|
99046
|
||||||
|
11847
|
||||||
|
|
||||||
|
Move: 8 Up
|
||||||
|
aa533
|
||||||
|
22033
|
||||||
|
99846
|
||||||
|
11047
|
||||||
|
|
||||||
|
Move: 8 Up
|
||||||
|
aa533
|
||||||
|
22833
|
||||||
|
99046
|
||||||
|
11047
|
||||||
|
|
||||||
|
Move: 4 Left
|
||||||
|
aa533
|
||||||
|
22833
|
||||||
|
99406
|
||||||
|
11407
|
||||||
|
|
||||||
|
Move: 6 Left
|
||||||
|
aa533
|
||||||
|
22833
|
||||||
|
99460
|
||||||
|
11407
|
||||||
|
|
||||||
|
Move: 6 Down
|
||||||
|
aa533
|
||||||
|
22833
|
||||||
|
99400
|
||||||
|
11467
|
||||||
|
|
||||||
|
Move: 3 Down
|
||||||
|
aa500
|
||||||
|
22833
|
||||||
|
99433
|
||||||
|
11467
|
||||||
|
|
||||||
|
Length: 112
|
||||||
345
src/main.rs
Normal file
345
src/main.rs
Normal file
|
|
@ -0,0 +1,345 @@
|
||||||
|
use smallvec::SmallVec;
|
||||||
|
use std::collections::{hash_map::Entry::Vacant, HashMap, VecDeque};
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Copy)]
|
||||||
|
struct Board {
|
||||||
|
board: [[u8; 5]; 4],
|
||||||
|
pieces: [[u8; 2]; 11],
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Board {
|
||||||
|
fn new() -> Self {
|
||||||
|
Self {
|
||||||
|
board: [
|
||||||
|
[1, 1, 0, 2, 2],
|
||||||
|
[3, 3, 4, 5, 6],
|
||||||
|
[3, 3, 4, 7, 8],
|
||||||
|
[9, 9, 0, 10, 10],
|
||||||
|
],
|
||||||
|
pieces: [
|
||||||
|
[0, 0],
|
||||||
|
[0, 0],
|
||||||
|
[3, 0],
|
||||||
|
[0, 1],
|
||||||
|
[2, 1],
|
||||||
|
[3, 1],
|
||||||
|
[4, 1],
|
||||||
|
[3, 2],
|
||||||
|
[4, 2],
|
||||||
|
[0, 3],
|
||||||
|
[3, 3],
|
||||||
|
],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn apply_move(&mut self, m: &Move) {
|
||||||
|
let pos = self.pieces[m.piece as usize];
|
||||||
|
let tiles: &[[u8; 2]] = match &m.piece {
|
||||||
|
1 | 2 | 9 | 10 => &[[0, 0], [1, 0]],
|
||||||
|
3 => &[[0, 0], [1, 0], [0, 1], [1, 1]],
|
||||||
|
4 => &[[0, 0], [0, 1]],
|
||||||
|
5..=8 => &[[0, 0]],
|
||||||
|
_ => unreachable!(),
|
||||||
|
};
|
||||||
|
|
||||||
|
for [x, y] in tiles {
|
||||||
|
self.board[(pos[1] + y) as usize][(pos[0] + x) as usize] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
let newpos = match &m.dir {
|
||||||
|
Dir::Up => [pos[0], pos[1] - 1],
|
||||||
|
Dir::Right => [pos[0] + 1, pos[1]],
|
||||||
|
Dir::Down => [pos[0], pos[1] + 1],
|
||||||
|
Dir::Left => [pos[0] - 1, pos[1]],
|
||||||
|
};
|
||||||
|
|
||||||
|
for [x, y] in tiles {
|
||||||
|
self.board[(newpos[1] + y) as usize][(newpos[0] + x) as usize] = m.piece;
|
||||||
|
}
|
||||||
|
|
||||||
|
self.pieces[m.piece as usize] = newpos;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn revert_move(&mut self, m: &Move) {
|
||||||
|
let im = Move {
|
||||||
|
dir: match m.dir {
|
||||||
|
Dir::Up => Dir::Down,
|
||||||
|
Dir::Right => Dir::Left,
|
||||||
|
Dir::Down => Dir::Up,
|
||||||
|
Dir::Left => Dir::Right,
|
||||||
|
},
|
||||||
|
piece: m.piece,
|
||||||
|
};
|
||||||
|
self.apply_move(&im);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_hash(&self) -> u64 {
|
||||||
|
let mut r = 0;
|
||||||
|
let p = self.pieces[3];
|
||||||
|
r |= (p[0] << 2 | p[1]) as u64;
|
||||||
|
let p = self.pieces[4];
|
||||||
|
r |= ((p[0] << 2 | p[1]) as u64) << 5;
|
||||||
|
|
||||||
|
let mut p = [
|
||||||
|
self.pieces[1],
|
||||||
|
self.pieces[2],
|
||||||
|
self.pieces[9],
|
||||||
|
self.pieces[10],
|
||||||
|
];
|
||||||
|
p.sort();
|
||||||
|
for (i, p) in p.into_iter().enumerate() {
|
||||||
|
r |= ((p[0] << 2 | p[1]) as u64) << (i * 5 + 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut p = [
|
||||||
|
self.pieces[5],
|
||||||
|
self.pieces[6],
|
||||||
|
self.pieces[7],
|
||||||
|
self.pieces[8],
|
||||||
|
];
|
||||||
|
p.sort();
|
||||||
|
for (i, p) in p.into_iter().enumerate() {
|
||||||
|
r |= ((p[0] << 2 | p[1]) as u64) << (i * 5 + 30);
|
||||||
|
}
|
||||||
|
|
||||||
|
r
|
||||||
|
}
|
||||||
|
|
||||||
|
fn possible_moves(&self) -> SmallVec<[Move; 8]> {
|
||||||
|
let mut v = SmallVec::new();
|
||||||
|
|
||||||
|
for i in 1..=10 {
|
||||||
|
let [px, py] = self.pieces[i as usize];
|
||||||
|
match i {
|
||||||
|
1 | 2 | 9 | 10 => {
|
||||||
|
if px > 0 && self.board[py as usize][(px - 1) as usize] == 0 {
|
||||||
|
v.push(Move {
|
||||||
|
dir: Dir::Left,
|
||||||
|
piece: i,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if px < 3 && self.board[py as usize][(px + 2) as usize] == 0 {
|
||||||
|
v.push(Move {
|
||||||
|
dir: Dir::Right,
|
||||||
|
piece: i,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if py > 0
|
||||||
|
&& self.board[(py - 1) as usize][px as usize] == 0
|
||||||
|
&& self.board[(py - 1) as usize][(px + 1) as usize] == 0
|
||||||
|
{
|
||||||
|
v.push(Move {
|
||||||
|
dir: Dir::Up,
|
||||||
|
piece: i,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if py < 3
|
||||||
|
&& self.board[(py + 1) as usize][px as usize] == 0
|
||||||
|
&& self.board[(py + 1) as usize][(px + 1) as usize] == 0
|
||||||
|
{
|
||||||
|
v.push(Move {
|
||||||
|
dir: Dir::Down,
|
||||||
|
piece: i,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
3 => {
|
||||||
|
if px > 0
|
||||||
|
&& self.board[py as usize][(px - 1) as usize] == 0
|
||||||
|
&& self.board[(py + 1) as usize][(px - 1) as usize] == 0
|
||||||
|
{
|
||||||
|
v.push(Move {
|
||||||
|
dir: Dir::Left,
|
||||||
|
piece: i,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if px < 3
|
||||||
|
&& self.board[py as usize][(px + 2) as usize] == 0
|
||||||
|
&& self.board[(py + 1) as usize][(px + 2) as usize] == 0
|
||||||
|
{
|
||||||
|
v.push(Move {
|
||||||
|
dir: Dir::Right,
|
||||||
|
piece: i,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if py > 0
|
||||||
|
&& self.board[(py - 1) as usize][px as usize] == 0
|
||||||
|
&& self.board[(py - 1) as usize][(px + 1) as usize] == 0
|
||||||
|
{
|
||||||
|
v.push(Move {
|
||||||
|
dir: Dir::Up,
|
||||||
|
piece: i,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if py < 2
|
||||||
|
&& self.board[(py + 2) as usize][px as usize] == 0
|
||||||
|
&& self.board[(py + 2) as usize][(px + 1) as usize] == 0
|
||||||
|
{
|
||||||
|
v.push(Move {
|
||||||
|
dir: Dir::Down,
|
||||||
|
piece: i,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
4 => {
|
||||||
|
if px > 0
|
||||||
|
&& self.board[py as usize][(px - 1) as usize] == 0
|
||||||
|
&& self.board[(py + 1) as usize][(px - 1) as usize] == 0
|
||||||
|
{
|
||||||
|
v.push(Move {
|
||||||
|
dir: Dir::Left,
|
||||||
|
piece: i,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if px < 4
|
||||||
|
&& self.board[py as usize][(px + 1) as usize] == 0
|
||||||
|
&& self.board[(py + 1) as usize][(px + 1) as usize] == 0
|
||||||
|
{
|
||||||
|
v.push(Move {
|
||||||
|
dir: Dir::Right,
|
||||||
|
piece: i,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if py > 0 && self.board[(py - 1) as usize][px as usize] == 0 {
|
||||||
|
v.push(Move {
|
||||||
|
dir: Dir::Up,
|
||||||
|
piece: i,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if py < 2 && self.board[(py + 2) as usize][px as usize] == 0 {
|
||||||
|
v.push(Move {
|
||||||
|
dir: Dir::Down,
|
||||||
|
piece: i,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
5..=8 => {
|
||||||
|
if px > 0 && self.board[py as usize][(px - 1) as usize] == 0 {
|
||||||
|
v.push(Move {
|
||||||
|
dir: Dir::Left,
|
||||||
|
piece: i,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if px < 4 && self.board[py as usize][(px + 1) as usize] == 0 {
|
||||||
|
v.push(Move {
|
||||||
|
dir: Dir::Right,
|
||||||
|
piece: i,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if py > 0 && self.board[(py - 1) as usize][px as usize] == 0 {
|
||||||
|
v.push(Move {
|
||||||
|
dir: Dir::Up,
|
||||||
|
piece: i,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if py < 3 && self.board[(py + 1) as usize][px as usize] == 0 {
|
||||||
|
v.push(Move {
|
||||||
|
dir: Dir::Down,
|
||||||
|
piece: i,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => unreachable!(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
v
|
||||||
|
}
|
||||||
|
|
||||||
|
fn print(&self) {
|
||||||
|
for y in 0..4 {
|
||||||
|
for x in 0..5 {
|
||||||
|
print!("{:x}", self.board[y][x]);
|
||||||
|
}
|
||||||
|
println!();
|
||||||
|
}
|
||||||
|
println!();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Copy)]
|
||||||
|
enum Dir {
|
||||||
|
Up,
|
||||||
|
Right,
|
||||||
|
Down,
|
||||||
|
Left,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Copy)]
|
||||||
|
struct Move {
|
||||||
|
dir: Dir,
|
||||||
|
piece: u8,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn solver() -> Option<(HashMap<u64, (u64, Move)>, Board)> {
|
||||||
|
let mut solution = HashMap::new();
|
||||||
|
let mut queue = VecDeque::new();
|
||||||
|
|
||||||
|
solution.insert(
|
||||||
|
Board::new().get_hash(),
|
||||||
|
(
|
||||||
|
0,
|
||||||
|
Move {
|
||||||
|
dir: Dir::Up,
|
||||||
|
piece: 0,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
queue.push_back(Board::new());
|
||||||
|
|
||||||
|
while let Some(q) = queue.pop_front() {
|
||||||
|
let moves = q.possible_moves();
|
||||||
|
|
||||||
|
for m in moves {
|
||||||
|
let mut b = q;
|
||||||
|
|
||||||
|
b.apply_move(&m);
|
||||||
|
|
||||||
|
if let Vacant(e) = solution.entry(b.get_hash()) {
|
||||||
|
e.insert((q.get_hash(), m));
|
||||||
|
if b.pieces[3] == [3, 1] {
|
||||||
|
return Some((solution, b));
|
||||||
|
}
|
||||||
|
queue.push_back(b);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
None
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
if let Some((s, b)) = solver() {
|
||||||
|
let mut h = b.get_hash();
|
||||||
|
|
||||||
|
let mut r = Vec::new();
|
||||||
|
while let Some(&(i, m)) = s.get(&h) {
|
||||||
|
// println!("{:b}", i);
|
||||||
|
r.push(m);
|
||||||
|
h = i;
|
||||||
|
}
|
||||||
|
|
||||||
|
r.reverse();
|
||||||
|
|
||||||
|
let mut b = Board::new();
|
||||||
|
for m in &r[1..] {
|
||||||
|
b.print();
|
||||||
|
b.apply_move(m);
|
||||||
|
println!("Move: {} {:?}", m.piece, m.dir);
|
||||||
|
}
|
||||||
|
b.print();
|
||||||
|
println!("Length: {}", r.len() - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue