by Jarno Elonen, 2003-2004
Most Mahjong Solitaire (aka. Taipei, Shanghai, Mahjongg) computer implementations can generate puzzles that are guaranteed to be solvable. Even so, it is impossible to come up with an algorithm that could always solve them. For a proof, consider the following elementary case...
...and the rules of the game:
- You win the game if you can remove all the tiles from the table.
- You can only remove a pair of similar tiles, both of which have to have at least one completely free wide (tall) side.
Without further analysis, it is immediately clear that the only way to win the above game is to start by taking out the 1-tiles on top the stack and on the bottom left. There is, however, no way to know which of the left-hand side 1-tiles to pick first without peeking into the tall stack.
(Interestingly, this sort of guess-game is an NP problem but definitely not a P one: if an oracle told you the correct solution, verifying it would be an O(N) operation. I doubt an incomplete information problem like this qualifies as a winner of the CMI Millennium Prize, though. *sigh*..)
If, however, you are allowed to peek under the tiles before taking them (complete-information variant of the game), it is obviously possible to write a solver. See: C program by Pedro Gimeno Fortea and Stam, T.: Solving Mahjong Solitaire Positions (2007).