1276: N皇后问题
时间限制: 1 Sec 内存限制: 128 MB
提交: 21 解决: 11
[提交][状态][讨论版]
题目描述
在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 <stdlib.h>
int queen[15],n,flag;//queen 保存列号
void print()//输出列数
{
for(int i=0;i<n-1;i++)
printf("%d ",queen[i]+1);
printf("%d\n",queen[n-1]+1);
return ;
}
int judge(int m)//判断皇后是否满足 不在 同一行,和任意对角线
{
for(int i=0;i<m;i++)
{
if(queen[m]==queen[i] || abs(queen[m]-queen[i])==abs(m-i))
return 0;
}
return 1;
}
void dfs(int m)//m代表皇后的行号,两个皇后一定不会位于同一行
{
if(m==n)
{
flag=1;
print();
return ;
}
for(int i=0;i<n;i++)
{
queen[m]=i;
if(judge(m))
{
dfs(m+1);
}
}
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
flag=0;
dfs(0);
if(!flag)
printf("no\n");
}
return 0;
}