Principles of Algorithmic Problem Solving