c c 求解N皇后問題(遞迴,棧,暴力)

2021-09-28 16:24:08 字數 1875 閱讀 5599

問題分析考慮八皇后問題,最簡單的方法就是對棋盤的每個格仔進行有或沒有的判斷。得到的問題規模就是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個王后的放置方法,直至放置完所有棋子,檢查放置方式是否合法,若合法則輸出 不合法則返回,嘗試...