提到回溯算法那肯定離不開 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表示當前處理的行
//n表示需要放置多少個皇后,同時也代表棋盤的大小為n*n
//queen用來記錄皇后的位置
//attack用來表示皇后的攻擊范圍
privatevoidbacktrack(intk,intn,char[][]queen,int[][]attack){
//如果發(fā)現(xiàn)在棋盤的最后一行放置好了皇后,那么就說明找到了一組符合要求的解
if(k==n){
//由于queen為二維字符數(shù)組,所以需要轉(zhuǎn)換為字符串數(shù)組
Listlist=newArrayList<>();
//遍歷二維數(shù)組queen
//取出queen的每一行字符數(shù)組c
for(char[]c:queen){
//把字符數(shù)組c中的所有字符轉(zhuǎ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),把attack中的所有元素深度拷貝到temp
for(intl=0;lfor(intm=0;m//queen用來記錄皇后的位置
//那么(k,i)的位置queen[k][i]='Q'
queen[k][i]='Q';
//由于新放置了一個皇后,所以攻擊范圍又更多了
//所以需要更新attack數(shù)組
//新放置皇后的坐標為(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]='.';
}
}
}
//坐標(x,y)為皇后所處的位置
//更新attack
privatevoidcheckQueenAttack(intx,inty,int[][]attack){
//對于每一個坐標(x,y)來說,都有上、下、左、右、左上、左下、右上、右下八個方向
//【左上】的坐標為(x-1,y-1)
//【上】的坐標為(x-1,y)
//【右上】的坐標為(x+1,y+1)
//【左】的坐標為(x,y+1)
//【右】的坐標為(x,y-1)
//【左下】的坐標為(x+1,y-1)
//【下】的坐標為(x+1,y)
//【右下】的坐標為(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};
//皇后所處的坐標肯定是皇后能攻擊的位置,設(shè)置為1
attack[x][y]=1;
//以坐標(x,y)為中心,去更新它八個方向的坐標
for(intj=0;j8;j++){
//由內(nèi)向外的進行更新
for(inti=1;i//新的位置的坐標行為x+i*dx[j]
intnx=x+i*dx[j];
//新的位置的坐標列為y+i*dy[j]
intny=y+i*dy[j];
//如果新位置的坐標在n*n的棋盤范圍內(nèi)
if(nx>=0&&nx=0&&ny//那么這些位置就是在坐標為(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文章
4976瀏覽量
74378 -
回溯算法
+關(guān)注
關(guān)注
0文章
10瀏覽量
6758
原文標題:回溯算法經(jīng)典題目之 N 皇后
文章出處:【微信號:TheAlgorithm,微信公眾號:算法與數(shù)據(jù)結(jié)構(gòu)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
熱點推薦
深入解析FDC3601N:高性能N溝道MOSFET的卓越之選
深入解析FDC3601N:高性能N溝道MOSFET的卓越之選 在電子設(shè)計領(lǐng)域,MOSFET作為關(guān)鍵的半導(dǎo)體器件,其性能對電路的整體表現(xiàn)起著至關(guān)重要的作用。今天,我們將深入探討 onsemi 公司推出
深入解析FDN357N:高性能N溝道MOSFET的卓越之選
深入解析FDN357N:高性能N溝道MOSFET的卓越之選 在電子工程師的日常設(shè)計中,MOSFET的選擇至關(guān)重要,它直接影響著電路的性能和穩(wěn)定性。今天,我們就來深入探討一款性能出色的N
安森美NTA4001N和NVA4001N MOSFET:小尺寸大性能的理想之選
安森美NTA4001N和NVA4001N MOSFET:小尺寸大性能的理想之選 在電子設(shè)備的設(shè)計中,MOSFET作為關(guān)鍵的半導(dǎo)體器件,其性能和特性對整個系統(tǒng)的運行起著至關(guān)重要的作用。今天,我們就來
安森美NTS4409N和NVS4409N MOSFET:小信號應(yīng)用的理想之選
安森美NTS4409N和NVS4409N MOSFET:小信號應(yīng)用的理想之選 在電子設(shè)計領(lǐng)域,MOSFET作為關(guān)鍵的半導(dǎo)體器件,廣泛應(yīng)用于各種電路中。安森美的NTS4409N和NVS4
NTD5406N與STD5406N:功率MOSFET的卓越之選
NTD5406N與STD5406N:功率MOSFET的卓越之選 在電子設(shè)計領(lǐng)域,功率MOSFET作為關(guān)鍵元件,對電路性能起著至關(guān)重要的作用。今天,我們將深入探討NTD5406N和STD
深入解析NTMFS4C06N:高性能N溝道MOSFET的卓越之選
深入解析NTMFS4C06N:高性能N溝道MOSFET的卓越之選 在電子工程師的日常設(shè)計工作中,MOSFET作為一種關(guān)鍵的功率器件,其性能直接影響著電路的效率和穩(wěn)定性。今天,我們就來詳細探討一下
安森美NVMFS5C628N:高性能N溝道MOSFET的卓越之選
安森美NVMFS5C628N:高性能N溝道MOSFET的卓越之選 在電子設(shè)計領(lǐng)域,MOSFET作為關(guān)鍵的功率開關(guān)元件,其性能直接影響到整個系統(tǒng)的效率和穩(wěn)定性。今天我們來深入了解安森美(onsemi
深入剖析NVTFS015N04C:高性能N溝道MOSFET的卓越之選
深入剖析NVTFS015N04C:高性能N溝道MOSFET的卓越之選 在電子工程領(lǐng)域,MOSFET(金屬 - 氧化物 - 半導(dǎo)體場效應(yīng)晶體管)是不可或缺的關(guān)鍵元件,廣泛應(yīng)用于各種電子設(shè)備中。今天
Onsemi NVMFS5C670N N溝道MOSFET:緊湊設(shè)計下的高性能之選
Onsemi NVMFS5C670N N溝道MOSFET:緊湊設(shè)計下的高性能之選 在電子工程師的日常設(shè)計中,選擇一款合適的MOSFET至關(guān)重要,它直接影響著整個電路的性能和穩(wěn)定性。今天我們就來深入
FDB0165N807L N-Channel PowerTrench? MOSFET:工業(yè)應(yīng)用的理想之選
FDB0165N807L N-Channel PowerTrench? MOSFET:工業(yè)應(yīng)用的理想之選 在電子工程領(lǐng)域,MOSFET作為一種常用的功率器件,其性能直接影響著整個電路的效率和穩(wěn)定性
探索 onsemi FDP22N50N:高性能 N 溝道 MOSFET 的卓越之選
探索 onsemi FDP22N50N:高性能 N 溝道 MOSFET 的卓越之選 在電子工程師的日常設(shè)計中,MOSFET 是至關(guān)重要的元件之一。今天,我們就來深入了解 onsemi 推出的一款
C語言的常見算法
) + fibonacci(n - 2);
}
```
## 4. 數(shù)學(xué)算法
### 最大公約數(shù) (GCD)
```c
int gcd(int a, int b) {
if (b == 0
發(fā)表于 11-24 08:29
山東LP-SCADA故障回溯功能的好處
關(guān)鍵字:LP-SCADA, LP-SCADA平臺 , LP-SCADA系統(tǒng), 軟件回溯功能,藍鵬測控
得益于本平臺毫秒級的采集延遲,本平臺除了具有普通監(jiān)控采集平臺的所有監(jiān)控功能外,還可用于產(chǎn)線、設(shè)備
發(fā)表于 05-29 14:42
回溯算法經(jīng)典題目之N皇后
評論