N皇后问题
时间限制: 1 Sec 内存限制: 128 MB[ 提交][ 状态][ 讨论版]
题目描述
在N*N(1<N<=9)的棋盘上放置N个皇后而彼此不受攻击(即在棋盘的任一行,任一列和任一对角线上不能放置2个皇后),编程求解所有的摆放方法。
[输入格式]
一个整数n(1<n<=9)
[输出格式]
若有解,输出若干行,每行n个数,依次表示第i个皇后的列号
若无解,输出 “no”
[输入样例]
4
[输出样例]
2 4 1 3
3 1 4 2
# include<stdio.h>
# include<string.h>
# include<math.h>
int max,k;
int n,a[25],b[25];
int w(int k1,int k2) //判断当前的皇后与先前放好的皇后是否在同一对角线不在同一对角线的条件
{
for(int i=1;i<k1;i++)
{
if(fabs(a[i]-k2)==fabs(i-k1)) //判断两个皇后不在同一对角线的条件
return 0;
}
return 1;
}
void dfs(int c1)//c1为皇后的行数
{
if(c1==n+1)
{
for(int i=1;i<=n;i++)
printf("%d ",a[i]);
printf("\n");
max++;
}
else {
for(int i=1;i<=n;i++)
{
if(!b[i]&&w(c1,i)) //判断皇后的不同行,不同列,不同对角线
{
b[i]=1;
a[c1]=i; //i为皇后的列数
dfs(++c1); //递归,下一行的皇后
b[i]=0;
a[c1-1]=0;
c1--;
}
}
}
return ;
}
int main(){
scanf("%d",&n);
memset(b,0,sizeof(b));
memset(a,0,sizeof(a));
max=0;
dfs(1);
if(!max)
printf("no\n");
return 0;
}