面試題 08.12. N皇后問題 - Kotlin 解法

設(shè)計(jì)一種算法,打印 N 皇后在 N × N 棋盤上的各種擺法刺桃,其中每個(gè)皇后都不同行、不同列吸祟,也不在對(duì)角線上瑟慈。這里的“對(duì)角線”指的是所有的對(duì)角線,不只是平分整個(gè)棋盤的那兩條對(duì)角線屋匕。

注意:本題相對(duì)原題做了擴(kuò)展

示例:

輸入:4
輸出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]]
解釋: 4 皇后問題存在如下兩個(gè)不同的解法葛碧。
[
[".Q..", // 解法 1
"...Q",
"Q...",
"..Q."],

["..Q.", // 解法 2
"Q...",
"...Q",
".Q.."]
]

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/eight-queens-lcci
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系官方授權(quán)过吻,非商業(yè)轉(zhuǎn)載請(qǐng)注明出處进泼。

Kotlin 解決

fun main() {
    println(
        Solution().solveNQueens(4)
    )
}


class Solution {
    var N = 0 // 替代n,棋盤的大小 [0...n-1]

    var board = ArrayList<StringBuilder>()// 棋盤
    var recordList = ArrayList<Point>() // 記錄皇后的位置纤虽,用于判斷能否放置皇后

    private val result = ArrayList<ArrayList<String>>()// 存放結(jié)果

    fun solveNQueens(n: Int): List<List<String>> {
        initBoard(n) // 初始化棋盤
        _solveNQueens(0)
        return result
    }

    // 回溯法
    private fun _solveNQueens(colum: Int) {
        if (colum > N) {
            result.add(ArrayList(board.map { it.toString() }))
            return
        }

        for (row in 0..N) {// 當(dāng)前colum行乳绕,遍歷每一列,
            if (isPlaced(colum, row)) {
                board[colum][row] = 'Q'
                recordList.add(Point(colum, row))

                _solveNQueens(colum + 1)

                recordList.removeAt(recordList.lastIndex)
                board[colum][row] = '.'
            }
        }
    }


    // 是否滿足皇后問題
    private fun isPlaced(colum: Int, row: Int): Boolean {
        if (recordList.isEmpty()) return false

        for (l in recordList) {
            if (l.row == row) return false

            if (row - (colum - l.colum) == l.row) return false

            if (row + (colum - l.colum) == l.row) return false

        }

        return true
    }

    // 初始化
    private fun initBoard(n: Int) {
        N = n - 1
        val columnElement = StringBuilder()

        // 初始化一行棋盤
        for (i in 0..N) {
            columnElement.append('.')
        }

        // 初始化整個(gè)棋盤
        for (i in 0..N) {
            board.add(StringBuilder(columnElement.toString()))
        }
    }


}

class Point constructor(var colum: Int, var row: Int) {

    override fun toString(): String {
        return "Point(colum=$colum, row=$row)"
    }
}

遇到的問題:

  1. Kotlin 傳參數(shù)與Java一樣是引用傳遞逼纸,初始化 map 時(shí)洋措,沒有 new 對(duì)象。
    解決:保存結(jié)果應(yīng)該創(chuàng)建新對(duì)象result.add(ArrayList(map.map { it.toString() }))
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末杰刽,一起剝皮案震驚了整個(gè)濱河市菠发,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌贺嫂,老刑警劉巖滓鸠,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異第喳,居然都是意外死亡糜俗,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來悠抹,“玉大人珠月,你說我怎么就攤上這事⌒颗ィ” “怎么了桥温?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)梁丘。 經(jīng)常有香客問我侵浸,道長(zhǎng),這世上最難降的妖魔是什么氛谜? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任掏觉,我火速辦了婚禮,結(jié)果婚禮上值漫,老公的妹妹穿的比我還像新娘澳腹。我一直安慰自己,他們只是感情好杨何,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布酱塔。 她就那樣靜靜地躺著,像睡著了一般危虱。 火紅的嫁衣襯著肌膚如雪羊娃。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天埃跷,我揣著相機(jī)與錄音蕊玷,去河邊找鬼。 笑死弥雹,一個(gè)胖子當(dāng)著我的面吹牛垃帅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播剪勿,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼贸诚,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了窗宦?” 一聲冷哼從身側(cè)響起赦颇,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎赴涵,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體订讼,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡髓窜,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片寄纵。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鳖敷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出程拭,到底是詐尸還是另有隱情定踱,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布恃鞋,位于F島的核電站崖媚,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏恤浪。R本人自食惡果不足惜畅哑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望水由。 院中可真熱鬧荠呐,春花似錦、人聲如沸砂客。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鞠值。三九已至媚创,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間齿诉,已是汗流浹背筝野。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留粤剧,地道東北人歇竟。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像抵恋,于是被迫代替她去往敵國和親焕议。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353