91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

回溯算法經(jīng)典題目之N皇后

算法與數(shù)據(jù)結(jié)構(gòu) ? 來源:吳師兄學(xué)算法 ? 作者:算法與數(shù)據(jù)結(jié)構(gòu) ? 2022-09-21 15:10 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

提到回溯算法那肯定離不開 n 皇后這道算法題,它實在是太經(jīng)典了。

所謂n 皇后問題,指的是如何將n個皇后放置在n×n的棋盤上,并且使皇后彼此之間不能相互攻擊。

皇后彼此不能相互攻擊,也就是說:任何兩個皇后都不能處于同一條橫行、縱行或斜線上。

給你一個整數(shù)n,返回所有不同的n 皇后問題的解決方案。

每一種解法包含一個不同的n 皇后問題的棋子放置方案,該方案中'Q''.'分別代表了皇后和空位。

輸入:n = 4
輸出:[[".Q..","...Q","Q...","..Q."],
["..Q.","Q...","...Q",".Q.."]]
解釋:4 皇后問題存在兩個不同的解法。

我覺得你應(yīng)該能夠結(jié)合視頻動畫和保姆級別的代碼注釋把這道題目弄清楚。

classSolution{

//保存所有符合要求的解
List>res=newArrayList<>();

publicList>solveNQueens(intn){

//attack用來表示皇后的攻擊范圍
int[][]attack=newint[n][n];
//queen用來記錄皇后的位置
char[][]queen=newchar[n][n];

//初始化二維數(shù)組queen中所有的元素為'.'
for(char[]c:queen){
Arrays.fill(c,'.');
}

//初始化二維數(shù)組attack中所有的元素為0
//0代表沒有皇后能攻擊得到
//1代表出于任意一個皇后的攻擊范圍內(nèi)
for(int[]c:attack){
Arrays.fill(c,0);
}

//從棋盤的第0行第0列處理n皇后的情況
backtrack(0,n,queen,attack);

//最后,返回所有符合要求的解
returnres;
}

//很顯然,每一行只能放置一個皇后,所以我們每一行每一行的來放置皇后
//k表示當(dāng)前處理的行
//n表示需要放置多少個皇后,同時也代表棋盤的大小為n*n
//queen用來記錄皇后的位置
//attack用來表示皇后的攻擊范圍
privatevoidbacktrack(intk,intn,char[][]queen,int[][]attack){

//如果發(fā)現(xiàn)在棋盤的最后一行放置好了皇后,那么就說明找到了一組符合要求的解
if(k==n){
//由于queen為二維字符數(shù)組,所以需要轉(zhuǎn)換為字符串?dāng)?shù)組
Listlist=newArrayList<>();
//遍歷二維數(shù)組queen
//取出queen的每一行字符數(shù)組c
for(char[]c:queen){
//把字符數(shù)組c中的所有字符轉(zhuǎn)換為字符串的形式進(jìn)行拼湊
//比如['.','Q','.','.',]
//轉(zhuǎn)換為'.Q..'
//把這個字符串加入到list中
list.add(String.copyValueOf(c));
}

//list即為一組符合要求的解,把它加入到結(jié)果數(shù)組中
res.add(list);
//由于遍歷完了所有的行,無需再遍歷下去,所以返回
return;
}

//每一行只能放置一個皇后
//并且每一列也只能放置一個皇后
//所以在k行中,從0列到n-1列,判斷皇后應(yīng)該放置到哪個位置
for(inti=0;i//如果發(fā)現(xiàn)attack[k][i]==0
//說明這個位置不在任何一個皇后的攻擊范圍內(nèi)
//所以可以考慮放置皇后
if(attack[k][i]==0){

//如果在(k,i)位置放置了皇后,那么就需要考慮在k+1行應(yīng)該怎么放置其它的皇后了
//由于有可能在(k,i)位置放置了皇后之后,在后續(xù)的其它行會無法再放置其它的皇后
//那么就需要回到(k,i)的狀態(tài),考慮能不能在(k,i+1)的位置放置
//為了能夠回到(k,i)的狀態(tài),所以需要先記錄此時的attack
//使用一個臨時的二維數(shù)組,深度拷貝attack
//如果不使用深度拷貝,而是直接使用int[][]temp=c
//會導(dǎo)致attack發(fā)生改變是temp也會發(fā)生改變
//這樣也就無法保存之前的狀態(tài)了
int[][]temp=newint[n][n];

//通過兩個for循環(huán),把a(bǔ)ttack中的所有元素深度拷貝到temp
for(intl=0;lfor(intm=0;m//queen用來記錄皇后的位置
//那么(k,i)的位置queen[k][i]='Q'
queen[k][i]='Q';

//由于新放置了一個皇后,所以攻擊范圍又更多了
//所以需要更新attack數(shù)組
//新放置皇后的坐標(biāo)為(k,i),同樣的需要更新它的八個方向
checkQueenAttack(k,i,attack);

//如果在(k,i)位置放置了皇后,那么就需要考慮在k+1行應(yīng)該怎么放置其它的皇后
//遞歸的調(diào)用backtrack在k+1行放置皇后
backtrack(k+1,n,queen,attack);

//遞歸結(jié)束后,拿走皇后,恢復(fù)attack的狀態(tài),考慮能不能在(k,i+1)的位置放置
attack=temp;

//恢復(fù)queen的狀態(tài),說明此時皇后不放置在(k,i)位置
queen[k][i]='.';
}
}


}

//坐標(biāo)(x,y)為皇后所處的位置
//更新attack
privatevoidcheckQueenAttack(intx,inty,int[][]attack){

//對于每一個坐標(biāo)(x,y)來說,都有上、下、左、右、左上、左下、右上、右下八個方向
//【左上】的坐標(biāo)為(x-1,y-1)
//【上】的坐標(biāo)為(x-1,y)
//【右上】的坐標(biāo)為(x+1,y+1)
//【左】的坐標(biāo)為(x,y+1)
//【右】的坐標(biāo)為(x,y-1)
//【左下】的坐標(biāo)為(x+1,y-1)
//【下】的坐標(biāo)為(x+1,y)
//【右下】的坐標(biāo)為(x+1,y+1)
//通過兩個一維數(shù)組可以表示這八個方向
//dx表示x的方向
intdx[]={-1,-1,-1,0,0,1,1,1};
//dy表示y的方向
intdy[]={-1,0,1,-1,1,-1,0,1};

//皇后所處的坐標(biāo)肯定是皇后能攻擊的位置,設(shè)置為1
attack[x][y]=1;

//以坐標(biāo)(x,y)為中心,去更新它八個方向的坐標(biāo)
for(intj=0;j8;j++){
//由內(nèi)向外的進(jìn)行更新
for(inti=1;i//新的位置的坐標(biāo)行為x+i*dx[j]
intnx=x+i*dx[j];
//新的位置的坐標(biāo)列為y+i*dy[j]
intny=y+i*dy[j];

//如果新位置的坐標(biāo)在n*n的棋盤范圍內(nèi)
if(nx>=0&&nx=0&&ny//那么這些位置就是在坐標(biāo)為(x,y)的皇后的攻擊范圍內(nèi),更新為1
attack[nx][ny]=1;
}

}
}
}
}

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4968

    瀏覽量

    74011
  • 回溯算法
    +關(guān)注

    關(guān)注

    0

    文章

    10

    瀏覽量

    6752

原文標(biāo)題:回溯算法經(jīng)典題目之 N 皇后

文章出處:【微信號:TheAlgorithm,微信公眾號:算法與數(shù)據(jù)結(jié)構(gòu)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    LM4050-N/-Q1:精密微功耗并聯(lián)電壓基準(zhǔn)的卓越

    LM4050-N/-Q1:精密微功耗并聯(lián)電壓基準(zhǔn)的卓越選 在電子工程師的日常設(shè)計工作中,電壓基準(zhǔn)源是一個至關(guān)重要的元件,它的性能直接影響到整個電路系統(tǒng)的精度和穩(wěn)定性。今天,我們就來深入探討一下
    的頭像 發(fā)表于 03-02 15:05 ?142次閱讀

    Onsemi FCB099N65S3:高效能N溝道MOSFET的卓越

    Onsemi FCB099N65S3:高效能N溝道MOSFET的卓越選 在電子工程領(lǐng)域,MOSFET是電源管理和開關(guān)電路中不可或缺的關(guān)鍵元件。今天,我們來深入了解一下Onsemi推出
    的頭像 發(fā)表于 01-26 17:05 ?142次閱讀

    探索 onsemi FCB070N65S3:高性能 N 溝道 MOSFET 的卓越

    探索 onsemi FCB070N65S3:高性能 N 溝道 MOSFET 的卓越選 在電子工程領(lǐng)域,MOSFET 作為關(guān)鍵的功率器件,其性能的優(yōu)劣直接影響著各類電源轉(zhuǎn)換系統(tǒng)的效率與穩(wěn)定性。今天
    的頭像 發(fā)表于 01-26 17:05 ?191次閱讀

    PID控制的算法

    當(dāng)中,PID控制算法又是最簡單,最能體現(xiàn)反饋思想的控制算法,可謂經(jīng)典中的經(jīng)典。經(jīng)典的未必是復(fù)雜的,經(jīng)典
    發(fā)表于 01-23 08:18

    回溯示波器的四次認(rèn)知躍遷

    工程師“第三只眼”的儀器,究竟走過了怎樣波瀾壯闊的百年歷程?它如何從一根陰極射線管,進(jìn)化成如今能“讀懂”電路故障的AI診斷官?今天,我們就撥開流量的迷霧,回溯示波器的四次認(rèn)知躍遷,看看它如何一步步塑造了現(xiàn)代電子世界。
    的頭像 發(fā)表于 12-19 15:39 ?6535次閱讀
    <b class='flag-5'>回溯</b>示波器的四次認(rèn)知躍遷

    單片機(jī)的算法

    平滑濾波算法 設(shè)置一個數(shù)據(jù)緩存區(qū),每新采集一個數(shù)據(jù)便存入暫存區(qū)中,同時去掉一個最老數(shù)據(jù),保存這N個數(shù)據(jù)始終是最新更新的數(shù)據(jù)。采用環(huán)型隊列結(jié)構(gòu)可以方便地實現(xiàn)這種數(shù)據(jù)存放方式。 #define
    發(fā)表于 11-28 08:19

    用于單片機(jī)幾種C語言算法

    ,必要時可通過實驗得到 中值濾波算法 該運算的過程是對某一參數(shù)連續(xù)采樣N次(N一般為奇數(shù)),然后把N次采樣的值按從小到大排列,再取中間值作為本次采樣值,整個過程實際上是一個序列排序的
    發(fā)表于 11-27 06:00

    C語言的常見算法

    ) + fibonacci(n - 2); } ``` ## 4. 數(shù)學(xué)算法 ### 最大公約數(shù) (GCD) ```c int gcd(int a, int b) { if (b == 0
    發(fā)表于 11-24 08:29

    e203除法器算法改進(jìn)(二)

    e203內(nèi)部除法操作使用加減交替迭代法進(jìn)行運算,除幾個特殊運算外,正常的除法操作需要33個周期才能輸出運算結(jié)果,極大程度地影響了系統(tǒng)的性能。我們對e203的除法器進(jìn)行了新的算法實現(xiàn)并改進(jìn)。目前高性能
    發(fā)表于 10-22 06:11

    2025電賽題目問答(已更新)

    2025電賽題目問答(已更新)
    的頭像 發(fā)表于 07-30 12:59 ?5192次閱讀
    2025電賽<b class='flag-5'>題目</b>問答(已更新)

    生產(chǎn)線回溯追溯系統(tǒng)選型:中設(shè)智控方案如何破解行業(yè)痛點?

    中設(shè)智控產(chǎn)線回溯追溯方案,從硬件到功能,精準(zhǔn)破解行業(yè)痛點,為電子制造、新能源等行業(yè)提供高效、可靠的生產(chǎn)管理工具,助力企業(yè)實現(xiàn)智能化生產(chǎn)升級,值得選型參考。
    的頭像 發(fā)表于 07-18 11:19 ?975次閱讀
    生產(chǎn)線<b class='flag-5'>回溯</b>追溯系統(tǒng)選型:中設(shè)智控方案如何破解行業(yè)痛點?

    基于FPGA實現(xiàn)FOC算法PWM模塊設(shè)計

    哈嘍,大家好,從今天開始正式帶領(lǐng)大家從零到一,在FPGA平臺上實現(xiàn)FOC算法,整個算法的框架如下圖所示,如果大家對算法的原理不是特別清楚的話,可以先去百度上學(xué)習(xí)一下,本教程著重介紹實現(xiàn)過程,弱化原理的介紹。那么本文將從PWM模塊
    的頭像 發(fā)表于 07-17 15:21 ?3508次閱讀
    基于FPGA實現(xiàn)FOC<b class='flag-5'>算法</b><b class='flag-5'>之</b>PWM模塊設(shè)計

    山東LP-SCADA故障回溯功能的好處

    關(guān)鍵字:LP-SCADA, LP-SCADA平臺 , LP-SCADA系統(tǒng), 軟件回溯功能,藍(lán)鵬測控 得益于本平臺毫秒級的采集延遲,本平臺除了具有普通監(jiān)控采集平臺的所有監(jiān)控功能外,還可用于產(chǎn)線、設(shè)備
    發(fā)表于 05-29 14:42

    從MDD1N4148談起:小信號開關(guān)二極管的經(jīng)典應(yīng)用場景

    在電子工程界,若說有哪一顆二極管堪稱“經(jīng)典之最”,MDD1N4148小信號開關(guān)二極管當(dāng)之無愧。自20世紀(jì)六十年代問世以來,1N4148因其快速恢復(fù)時間、穩(wěn)定可靠、價格低廉等特性,在無數(shù)電路中扮演著
    的頭像 發(fā)表于 05-19 11:32 ?1415次閱讀
    從MDD1<b class='flag-5'>N</b>4148談起:小信號開關(guān)二極管的<b class='flag-5'>經(jīng)典</b>應(yīng)用場景

    多種經(jīng)典電路合集

    N多的經(jīng)典電路,看看肯定有幫助!純分享貼,有需要可以直接下載附件獲取文檔! (如果內(nèi)容有幫助可以關(guān)注、點贊、評論支持一下哦~)
    發(fā)表于 04-24 16:53