https://github.com/michaelkim/15puzzle
A C++ solver for the generalized 15-Puzzle
https://github.com/michaelkim/15puzzle
15-puzzle cpp ida-star-algorithm
Last synced: 26 days ago
JSON representation
A C++ solver for the generalized 15-Puzzle
- Host: GitHub
- URL: https://github.com/michaelkim/15puzzle
- Owner: MichaelKim
- Created: 2017-10-16T13:43:04.000Z (over 7 years ago)
- Default Branch: master
- Last Pushed: 2022-01-01T23:17:29.000Z (over 3 years ago)
- Last Synced: 2025-02-06T22:23:28.689Z (3 months ago)
- Topics: 15-puzzle, cpp, ida-star-algorithm
- Language: C++
- Homepage:
- Size: 265 KB
- Stars: 3
- Watchers: 1
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# 15puzzle
This is a solver for the generalized 15-puzzle written in C++. It can optimally solve any p x q sized board, although it becomes very slow for boards larger than 4 x 4, and some 4 x 4 boards with long solutions.
To solve a puzzle, it uses the IDA\* algorithm with an [additive disjoint pattern database](https://www.sciencedirect.com/science/article/pii/S0004370201000923).
This solver has also been ported to WebAssembly using Emscripten [here](https://github.com/LenKagamine/15puzzle.js).
## Executable
### Build
```sh
make# or
mkdir build
cd build
cmake ..# or
g++ -std=c++17 src/*.cpp -o bin/puzzle
```### Usage
```
Syntax:
puzzle [OPTIONS]Options:
-b
Board files
-d
Use database file
-h, --help
Print this help message
-i, --interactive
Show a playback of each solution
```Alternatively, the database and board files can be read in through standard input. The following three commands will do the same solves:
```sh
cat databases/8-reg | ./puzzle -b boards/8-reg
cat boards/8-reg | ./puzzle -d databases/8-reg
cat databases/8-reg boards/8-reg | ./puzzle
```## File Formats
This program comes with several preset board sizes and database patterns. However, it is very simple to create custom boards and databases to solve any sized boards.
- `databases/8-reg` uses only one pattern for the entire 3x3 grid, as it is small enough to quickly generate the database.
- `databases/443-reg` is for solving the 11-puzzle.
- `databases/555-reg` and `databases/663-reg` both solve the 15-puzzle. The 663 pattern takes longer to generate (as larger patterns take exponentially longer), but solve it slightly faster than the 555 pattern.
- `databases/555-rev` is for the reversed 15-puzzle board.There are two versions of the solved state of the 15-puzzle: one has the empty tile in the top-left, and the other has it in the bottom-right. These two states have different parity, so one cannot be turned into the other. Hence, `555-rev` solves the reversed board with the empty tile in the top-left, while `555-reg` has the empty tile in the bottom-right.
### Databases
A database file consists of three parts:
- `p` and `q`: The width and height of the boards that this database solves
- `n`: The number of patterns in the databases
- The `n` patterns follow:
- Each pattern is a `p` x `q` board filled with numbers. Each tile that is part of the pattern has its number in its position, and the remaining irrelevant tiles have a 0.### Boards
A board file consists of three parts:
- `p` and `q`: The width and height of the following boards to be solved
- `n`: The number of boards to solve
- The `n` boards follow:
- Each board is a permutation of `p x q` numbers from 0 to `p x q - 1`. These numbers correspond to the tiles of the board, left-to-right and top-to-down. The blank is represented with a 0.## Results
All 8-puzzle boards can be solve in a fraction of a second. The hardest 8-puzzle boards take 31 moves to solve, and even those are solved instantly.
11-puzzle (4x3) boards can be solved relatively quickly, but I haven't tested all of them thoroughly.
Most 15-puzzle can be solved within 5 seconds. Solutions longer than ~55 moves will take significantly longer.
Any larger boards (5x4, 5x5, etc.) with non-trivial solutions will take extremely long to solve.