題目思路
深度優先搜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");
}
}