問題分析考慮八皇后問題,最簡單的方法就是對棋盤的每個格仔進行有或沒有的判斷。得到的問題規模就是o(2^(n*n)),也就是2的64次方。指數增長的時間複雜度是非常可怕的,不推薦這種做法,但是考慮不同人對問題的思考,下面將會擺出暴力解n皇后的解法。下面給出的各種解法都採用了空間換時間的方式,設定乙個陣列a,陣列下標表示的哪一行,陣列的值表示的是哪一列。
(1)暴力解:對n = 8的問題來說,皇后所在的行為0 ~ 7。因此,8個皇后可能儲存位置在00000000~77777777共8^8種情況。基於暴力分析的時候,該問題可以看作是8的8進製數字。基於該思想的**如下。
#include
#include
#define n 8
intplace
(int a[n]
)return1;
}int
main()
if(place
(a))
putchar
('\n');
}}printf
("total is : %d\n"
, count)
;return0;
}
(2)遞迴解:遞迴的本質是棧,因此第三個方法就是棧。對於遞迴來說,同樣有陣列a,作用同上。遞迴的過程就是函式本身呼叫本身的過程。在八皇后中,這種遞迴叫做直接遞迴;還有一種遞迴方式是間接遞迴。遞迴是一種思考方式,並沒有迭代的方式好。以下給出遞迴的**。
#include
#include
/*n皇后問題*/
#define n 8
int a[n]=;
int count =2;
intspace
(int row)
return1;
}void
dfs(
int row)
// row一行乙個
int i;
for( i =
0; i < n; i++)}
intmain()
(3)棧解:對於學過資料結構的人來說,棧並不陌生,它也是一種線性結構,不過它是受限制的,堅持先進後出的原則。你可以把它想像成乙個裝水的竹筒,只能從一邊裝水,然後從同一邊倒水。下面給出的**。
#include
#include
#include
#define maxsize 100
typedef
struct
sttype;
int count =0;
intplace
(sttype st,
int i,
int j)
//測試(i,j)是否與1~i-1皇后有衝突
else
k++;}
return1;
}void
queen
(int n)
find =0;
//每次退棧時重新檢查是否能放
for(j =
1; j <= n; j++)if
(place
(st, i +
1, j)
)//在i+1行找到乙個放皇后的位置(i+1,j)
if(find ==0)
//找不到放皇后的位置,回溯
if(j>n)
//當前皇后在本列沒有可放的位置
st.top--
;else
//本列找到乙個位置後退出回溯
break;}
}}}int
main()
N皇后問題的遞迴求解
n皇后問題 20 分 在n n的方格棋盤上,放置n個皇后,要求每個皇后不同行,不同列,不同左右對角線。其中n不超過10。要求 輸出所有的解。輸入格式 輸入n輸出格式 逐行輸出每一種解,用每個皇后的位置座標表示,每個位置座標之後均有乙個空格符,輸出最後一行為空行。輸入樣例 在這裡給出一組輸入。例如 6...
求解n皇后問題
n皇后問題 回溯法 遞迴的邏輯中一般有兩個重要的概念 1.遞迴邊界 2.遞迴式 1.問題描述 在n n格的西洋棋上擺放n個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。遞迴思想 int count 0 void generatep int index i...
n皇后問題求解
在乙個n n的棋盤上放置n個王后,使得每個王后不會相互攻擊,即任意兩個王后不在同一行 同一列 同一對角線上,輸出所有的放置方式。輸入n,表示棋盤大小。深度優先搜尋 dfs 列舉第i個王后的放法,再列舉第i 1個王后的放置方法,直至放置完所有棋子,檢查放置方式是否合法,若合法則輸出 不合法則返回,嘗試...