180 / 205
LeetCode · HardQiyin30 ball· ~40 daqiqa

N-Queens

n soni berilgan bo'lib, n ta shaxmat malikasini n x n taxtasiga shunday joylashtiringki, ulardan hech biri bir-birini ura olmasin. Har bir yechim taxtadagi tuzilishni o'z ichiga olishi kerak, bunda 'Q' malikani va '.' bo'sh katakni bildiradi.

example.go
func solve(n int) [][]string {
    // ...
}

Misollar

kod
Input: n = 4
Output: [[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]]
kod
Input: n = 1
Output: [["Q"]]
kod
Input: n = 2
Output: []

Maslahatlar

  1. Bu N-Queens II bilan bir xil backtracking (orqaga qaytish) mantig'iga asoslanadi, farqi shundaki bu safar taxta holatining o'zini ham saqlab, har bir to'liq yechim uchun taxta chizmasini yig'ish kerak bo'ladi.
  2. Ustunlar va ikkala diagonal (row+col hamda row-col+n) band-emasligini belgilaydigan uchta bool massiv bilan qatorma-qator ferzi joylashtiring; har bir qatorda qaysi ustunga ferzi qo'yilganini alohida massivda saqlang. n-qator to'liq to'ldirilganda, shu saqlangan ustun raqamlaridan '.' va 'Q' belgilaridan iborat taxta satrlarini yasab natijalar ro'yxatiga qo'shing, so'ng backtrack qilib boshqa variantlarni qidiring.