n皇后
在nXn格的国际象棋上摆放n个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法?
次数
#include<stdio.h>
#include<math.h>
int n,ans=0;
int f[1000];
int check(int x,int y){//判断是否矛盾
int i,j;
for(i=1;i<x;i++){
if(f[i]==y || abs(x-i)==abs(y-f[i])){
return 0;
}
}
return 1;
}
int dfs(int i){//搜索,判断是否可以到第n行,回 溯法
int j;
if(i==n+1){
ans++;
return 0;
}
for(j=1;j<=n;j++){
if(check(i,j)==1){
f[i]=j;
dfs(i+1);
}
}
}
int main(){
int i,j;
scanf("%d",&n);
dfs(1);
printf("%d",ans);
}
输出棋盘
#include<stdio.h>
#include<math.h>
int n,ans=0;
int f[1000];
int check(int x,int y){//判断是否矛盾
int i,j;
for(i=1;i<x;i++){
if(f[i]==y || abs(x-i)==abs(y-f[i])){
return 0;
}
}
return 1;
}
void out(){//输出方案
printf("case %d\n",ans);
int i,j;
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
if(f[i]==j) printf("%d ",1);
else printf("%d ",0);
}
printf("\n");
}
}
int dfs(int i){
int j;
if(i==n+1){
ans++;
out();
return 0;
}
for(j=1;j<=n;j++){
if(check(i,j)==1){
f[i]=j;
dfs(i+1);//继续搜,判断是否可以到第n行
}
}
}
int main(){
int i,j;
scanf("%d",&n);
dfs(1);
printf("%d",ans);
}