N皇后 遞歸解法

題目思路

深度優先搜DFS
void DFS(int x){
if(邊界條件){}
for(遍歷走一步的各種情況){
標記
DFS(x+1)
撤銷標記
}
}
用一維數組標記每一行的位置
用最簡單的方法判斷是否滿足放置要求

代碼

#include<stdio.h>
using namespace std;
int n;
int ans[11];
int cal(int n){
    return n>0 ? n:-n;
}
int check(int x,int y){
    for(int i=1;i<x;i++){
            if(ans[i]==y||cal(ans[i]-y)==cal(i-x))
            return 0;   
        }
    return 1;
}
bool success;
void DFS(int x){
    if(x==n+1){
            success=true;
            for(int i=1;i<=n;i++)printf("%d ",ans[i]);
            printf("\n");
            return;
        }
    for(int y=1;y<=n;y++){
        if(check(x,y)){
            ans[x]=y;
            DFS(x+1);}
    }
}


int main(void){
    while(scanf("%d",&n)!=EOF){
     success =false;
     DFS(1);
     if(!success)printf("no solute\n");
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章