Backtracking, according to Skiena, is another word for a brute force approach to a problem. While "brute force" sounds inelegant, there is still much room for creativity in:
- Modeling: How do you model a real life situation as a mathematical search space and evaluation function?
- Pruning: How do you identify certain cases as irrelevant, and don't need to be searched?
- Caching: How do you avoid unnecessary recomputing? This is very much related to dynamic programming.
- Ordering: How can you navigate the search space such that you search in places that you're more likely to find the answer first?
Backtracking problems almost always involve optimizing some function, or finding out whether an object has a certain property.