N 皇后問題(queen.cpp)

[題目描述]

在 N*N 的棋盤上放置 N 個皇后(n<=10)而彼此不受攻擊(即在棋盤的任一行,任一列和任一對角線上不能放置 2 個皇后) ,程式設計求解所有的擺放方法。

[輸入格式]

輸入:n

[輸出格式]

每行輸出一種方案,每種方案順序輸出皇后所在的列號,各個數之間有空格隔開。若無方案,則輸出no solute!

[輸入樣例]

4

[輸出樣例]

2 4 1 3

3 1 4 2

[解法]

看題直接DFS即可.主要DFS方法是把每一行看作一個盒子,每層DFS只考慮當前盒子(即當前行)的皇后擺.當把n行每行的皇后位置確定後也就找到了一種方法. 下面是最重要的程式碼段:

判斷是否與之前的皇后攻擊,因為是把每一行看作一個盒子所以不需要考慮行的皇后攻擊.

[程式碼(AC)]

 #include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;
int queen[];
int num;//num行
bool flag=false;//判斷是否有解標記
void n_queen(int n){
if(n>num){
flag=true;//有解,更新標記
for(int i=;i<=num;++i){//輸出解
printf("%d ",queen[i]);
}
printf("\n");
}
else {
for(int i=;i<=num;++i){
bool k=true;
for(int j=;j<n;++j){
if(n-j==i-queen[j]||i==queen[j]||n+i==queen[j]+j){//'\'斜||同一列||'/'斜
k=false;
break;
}
}
if(k){
queen[n]=i;//擺好這一行
n_queen(n+);//準備放下一行
}
}
}
}
int main(){
//freopen("queen.in","r",stdin);
//freopen("queen.out","w",stdout);
memset(queen,false,sizeof(queen));
scanf("%d",&num);
n_queen();//從第一行放
if(flag==false)printf("no solute!");
return ;
}
2018-10-05 22:20:16