Every instance of a computable problem can be solved in a finite number of steps, using an algorithm. Different problem-solving methods include:
Making an exhaustive list of all possible problem cases; brute forcing the problem. This can be largely inefficient for large problems
Creating a smaller model of a real-world system to better understand it's behaviour. This makes use of abstraction in a way that reduces the cost of testing the actual thing, especially when this could be expensive or dangerous.
Understading the way a system works to make it easier to approach or use, e.g. how come Dijkstra's algorithm actually works when finding the shortest path? How come A* is faster?
Basically, brainstorming random ideas for solutions, thinking outside the box. The best solution can be the most surprising.
Strategies that can help with problem solving include:
A method of problem decomposition. Breaks the problem up into smaller, more easily-solvable sub-problems.
Reducing the size of the problem after every iteration, e.g. binary search halves the size of the list each time.
Turning a problem into one that's already been solved (similar to abstraction by generalisation).
Automation also makes use of abstraction to create a simpler version of the problem, and writing and executing code to solve it, e.g. abstracting the cash flow of a business into a bunch of equations, which can be used to see if they can, say, cover certain costs using their cash in future.