To begin with, here are a few observations we can make regarding the queens and their problem.

Since no column nor row can have more than one queen, we can assign each queen to a specific column, and thereby reduce the problem to finding a row assignment for each.

When we think about what the behavior of a queen should be, one obvious behavior is that a queen should be able to take a pair of arguments, and tell whether or not it can attack the given position.

One way (by no means the only way) is to structure the problem using the concept of a generator. Each queen can be asked to find one solution, and then later be asked to find another solution, if the first solution is unacceptable for the problem as a whole.

[audio] [real] Text to accompany slide4, in Chapter 5 of An Introduction to Object-Oriented Programming