2n皇后問題 C

2021-10-02 07:34:54 字數 3126 閱讀 2361

首先讓我們先來看一下八皇后問題

題目描述 乙個如下的 6×6 的跳棋棋盤,有六個棋子被放置在棋盤上,使得每行、每列有且只有乙個,每條對角線(包括兩條主對角線的所有平行線)上至多有乙個棋子。

上面的布局可以用序列2 4 6 1 3 5來描述,第 i 個數字表示在第 i 行的相應位置有乙個棋子,如下:

行號1 2 3 4 5 6

列號2 4 6 1 3 5

這只是棋子放置的乙個解。請編乙個程式找出所有棋子放置的解。

並把它們以上面的序列方法輸出,解按字典順序排列。

請輸出前3個解。最後一行是解的總個數。

輸入格式

一行乙個正整數 n,表示棋盤是 n×n 大小的。

輸出格式

輸出格式 前三行為前三個解,每個解的兩個數字之間用乙個空格隔開。第四行只有乙個數字,表示解的總數。

以下為c++實現的源**

#include

#include

#include

#include

using

namespace std;

int n,all;

bool ck[14]

;int ins[14]

;bool

check

(int i,

int j)

return

true;}

void

dfs(

int i,

int num)

cout << endl;

}//memset(ins,0,sizeof(ins));

return;}

for(

int j =

1; j <= n; j ++)}

}}intmain()

主要思想是從1到n列中每次先從第一列開始給乙個數字,並開始進行搜尋,在深搜過程中用ck[n]陣列判斷這個數字是否被用,再用check(i,j)函式判斷該列中的數字即行數組成的座標是否會與之前的列數給定的座標是否構成對角線,最後再進行dfs(i+1,num+1);注意的是記得回溯。

題目描述

給定乙個n*n的棋盤,棋盤中有一些位置不能放皇后。現在要向棋盤中放入n個黑皇后和n個白皇后,使任意的兩個黑皇后都不在同一行、同一列或同一條對角線上,任意的兩個白皇后都不在同一行、同一列或同一條對角線上。問總共有多少種放法?n小於等於8。

輸入

輸入的第一行為乙個整數n,表示棋盤的大小。

接下來n行,每行n個0或1的整數,如果乙個整數為1,表示對應的位置可以放皇后,如果乙個整數為0,表示對應的位置不可以放皇后。

輸出

輸出乙個整數,表示總共有多少種放法。

樣例輸入

4 1 1 1 1

1 1 1 1

1 1 1 1

1 1 1 1

樣例輸出

2

2n皇后問題是對八皇后問題的乙個擴充套件,可以以同樣的思想解決此類問題。

思想也是一樣,先假設對黑皇后進行放置,同樣的先在每一列中放置不一樣的數字,即占用不一樣的行數,用ck1[n]判斷是否數字可用,再用check(i,j)函式判斷該座標是否會與之前座標構成對角線。多加的一步是你還得判斷放置的座標是否為1,即是否可用。再在放置黑皇后結束過程中在進行dfs2(i,j)重複乙個放置白皇后過程,最後還是得注意回溯。

c++**如下
#include

#include

#include

#include

using namespace std;

//做著題的細節就是回溯過程得仔細,你中途改變了原始值,呼叫函式後得回溯,復原

int n;

int ins[9]

[9];

int copy[9]

[9];

int black[9]

;int white[9]

;int flag;

bool check1[9]

;bool check2[9]

;int all;

bool check

(int i,

int j,

int flag)

else

}return true;

}void

dfs2

(int i)

for(

int j =

1; j <= n; j ++)}

}}}void

dfs(

int i)

//memset(black,0,sizeof(black));

dfs2(1

);for(

int i =

1; i <= n; i ++

)return;}

for(

int j =

1; j <= n; j ++)}

}}}int

main()

for(

int i =

1; i <= n; i ++

)dfs(1

);cout << all;

return0;

}

做這題時我最後想了很久的乙個點就是能否在dfs2(i,j)之前用memset函式將black[n]陣列置零,然後再將白皇后的位置用black陣列表示,省的再開乙個陣列。但可惜不行,因為深搜過程中分支是會相互影響的,你在分支過程中做的改變,必須在dfs後再回溯,不然會直接影響到最後的結果。還有乙個注意的點是你在放置黑皇后後你必須得把黑皇后所占用的座標置零,還得在最後dfs2搜尋後回溯。否則也會影響到最後結果。

這也是我的第一篇部落格,也是鼓勵自己能堅持寫下去的動力。

2n皇后問題

問題描述 在n n的矩陣中放入n個白皇后和n個黑皇后,該矩陣由元素 和 組成,代表該位置不能放皇后,代表可以放皇后,n個的皇后兩兩不能在同一行和同一列以及同一對 角線上,n個黑皇后兩兩不能在同一行和同一列以及同一對角線上。求最多有幾種放法?解法 這個問題跟 皇的問題類似,只不過多了另外一種顏色的皇后...

2n皇后問題

問題描述 給定乙個 n n 的棋盤,棋盤中有一些位置不能放皇后。現在要向棋盤中放入 n 個黑皇后和 n 個白皇后,使任意的兩個黑皇后都不在同一行 同一列或同一條對角線上,任意的兩個白皇后都不 在同一行 同一列或同一條對角線上。問總共有多少種放法?n 小於等於 8。輸入格式 輸入的第一行為乙個整數 n...

2n皇后問題

基礎練習 2n皇后問題 時間限制 1.0s 記憶體限制 512.0mb 問題描述 給定乙個n n的棋盤,棋盤中有一些位置不能放皇后。現在要向棋盤中放入n個黑皇后和n個白皇后,使任意的兩個黑皇后都不在同一行 同一列或同一條對角線上,任意的兩個白皇后都不在同一行 同一列或同一條對角線上。問總共有多少種放...