Este não é (IMO) um problema muito interessante do ponto de vista da programação. Você pode criar um algoritmo recursivo que tente todos os arranjos, algo como isto:
bool try_queens(Board board, int n)
{
if (n == 0) {
// no queens left to place, so we're done
return true
}
// try each open position until we find one that works
for each position on the board {
if (is_empty(board, position) and not is_attacked(board, position)) {
place_queen(board, position)
if (try_queens(board, n-1)) {
return true
}
remove_queen(board, position)
}
}
// if we get this far, there's no available position
return false
}
main()
{
initialize board(X,Y)
return try_queens(board, N)
}
Se você pensar um pouco sobre o problema, perceberá que não há como encaixar N rainhas em um quadro em que X <N ou Y <N, porque isso exigiria que pelo menos duas rainhas terminassem na mesma fila ou arquivo, e eles atacariam um ao outro. Se você ler sobre o problema das n-rainhas, aprenderá rapidamente que sempre é possível colocar N rainhas em uma placa NxN para N> 3. Agora sabemos que a resposta é NÃO para (X <N ou Y <N) e SIM para (X> = N e Y> = N, N> 3). Tudo o que resta são os casos especiais:
- N = 1 (SIM)
- N = 2 (SIM para X> = 2 e Y> 2 ou vice-versa)
- N = 3 (SIM para X> = 3 e Y> 3 ou vice-versa)
Portanto, agora nossa agradável função recursiva se torna uma função simples que apenas compara N a X e Y e retorna um resultado fixo. Isso é ótimo do ponto de vista do desempenho, pois você pode obter uma resposta em tempo constante. Não é tão bom do ponto de vista de programação, porque você percebe, neste momento, que a pergunta é realmente mais sobre o quão bem você pode resolver quebra-cabeças do que sobre sua capacidade de escrever uma função recursiva.
(E garoto, oh garoto, eu realmente espero que não tenha cometido algum erro estúpido na minha resposta. ;-)