Bu (IMO) programlama açısından çok ilginç bir sorun değil. Her düzenlemeyi deneyen, şöyle bir özyinelemeli algoritma ile gelebilirsiniz:
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)
}
Sorunu biraz düşünürseniz, X <N veya Y <N olan bir tahtaya N kraliçesi sığdırmanın bir yolu olmadığını anlayacaksınız, çünkü bu en az iki kraliçenin aynı sırada veya dosyada olmasını gerektirecektir, ve bu yüzden birbirlerine saldırırlardı. N-queens problemini okursanız N> N için NxN panosuna N que'leri yerleştirmenin her zaman mümkün olduğunu çabucak öğreneceksiniz. Şimdi cevabın NO (X <N veya Y <N) için olduğunu biliyoruz. ve YES (X> = N ve Y> = N, N> 3) için. Geriye kalan tek şey özel durumlar:
- N = 1 (EVET)
- N = 2 (X için EVET = 2 ve Y> 2 veya tam tersi)
- N = 3 (X için EVET = 3 ve Y> 3 veya tam tersi)
Şimdi güzel özyinelemeli fonksiyonumuz, sadece N ile X ve Y'yi karşılaştıran ve hazır bir sonuç veren basit bir fonksiyon haline gelir. Bu, performans açısından harika, çünkü sabit zamanda cevap alabilirsiniz. Programlama açısından o kadar da iyi değil, çünkü bu noktada sorunun, bulmacaları ne kadar iyi çözebileceğinizle ilgili olduğunu, tekrarlayan bir fonksiyon yazma yeteneğinizden çok daha iyi olduğunu fark ediyorsunuz.
(Ve oğlum ah oğlum, gerçekten benim smarty-pantolon cevabımda aptalca bir hata yapmadığımı umuyorum. ;-)