题目描述
在N*N(1<N<=9)的棋盘上放置N个皇后而彼此不受攻击(即在棋盘的任一行,任一列和任一对角线上不能放置2个皇后),编程求解所有的摆放方法。
输入
一个整数n(1<n<=9)
输出
若有解,输出若干行,每行n个数,中间有两个空格,依次表示第i个皇后的列号
若无解,输出 “no”
若无解,输出 “no”
样例输入
4
样例输出
2 4 1 3
3 1 4 2
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int a[100],b[100],c[100],ans[100],n;
//a,b,c数组的作用类似于以前的visited[],是否访问过或者叫是否使用过当前状态
bool flag;
void Print()
{
int i;
printf("%d",ans[1]);
for (i=2;i<=n;++i)
printf(" %d",ans[i]);
printf("\n");
flag=true;
return;
}
void dfs(int dep) //易知每行只能有一个皇后,即行号dep代表处理到第几个皇后了
{
int r;
if (dep==n+1)
Print();
for (r=1;r<=n;r++)//逐行搜索,按列循环,dep是行数,r是列数
if (!a[dep+r]&&!b[dep-r+n]&&!c[r])// 条件判断 a数组代表行,b数组代表对角线,c数组代表列
{
ans[dep]=r;//ans是记录数组
a[dep+r]=1; //标记上
b[dep-r+n]=1;
c[r]=1;
dfs(dep+1);
a[dep+r]=0;//回溯一步
b[dep-r+n]=0;
c[r]=0;
}
return;
}
int main()
{
scanf("%d",&n);
flag=false;
dfs(1);
if (flag==false)
printf("no");
return 0;
}
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int a[100],b[100],c[100],ans[100],n;
//a,b,c数组的作用类似于以前的visited[],是否访问过或者叫是否使用过当前状态
bool flag;
void Print()
{
int i;
printf("%d",ans[1]);
for (i=2;i<=n;++i)
printf(" %d",ans[i]);
printf("\n");
flag=true;
return;
}
void dfs(int dep) //易知每行只能有一个皇后,即行号dep代表处理到第几个皇后了
{
int r;
if (dep==n+1)
Print();
for (r=1;r<=n;r++)//逐行搜索,按列循环,dep是行数,r是列数
if (!a[dep+r]&&!b[dep-r+n]&&!c[r])// 条件判断 a数组代表行,b数组代表对角线,c数组代表列
{
ans[dep]=r;//ans是记录数组
a[dep+r]=1; //标记上
b[dep-r+n]=1;
c[r]=1;
dfs(dep+1);
a[dep+r]=0;//回溯一步
b[dep-r+n]=0;
c[r]=0;
}
return;
}
int main()
{
scanf("%d",&n);
flag=false;
dfs(1);
if (flag==false)
printf("no");
return 0;
}