https://erning.net/posts/2011-07-31-8-puzzle/