sliding puzzle algorithm