题目链接:洛谷n皇后例题
(不是只针对题目而整理的代码,下面的代码可能过不了上面洛谷的题目)
其实写这篇博客只要还是加深一下自己对于dfs的印象和理解,也方便以后自己回顾
题目描述:
一个如下的 6×6 的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行、每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子。
上面的布局可以用序列 2 4 6 1 3 5 来描述,第 i 个数字表示在第 i 行的相应位置有一个棋子,如下:
行号 1 2 3 4 5 6
列号 2 4 6 1 3 5
这只是棋子放置的一个解。请编一个程序找出所有棋子放置的解。
并把它们以上面的序列方法输出,解按字典顺序排列。
请输出前 3 个解。最后一行是解的总个数。
输入:
一行一个正整数 n,表示棋盘是 n×n 大小的。
输出:
前三行为前三个解,每个解的两个数字之间用一个空格隔开。第四行只有一个数字,表示解的总数。
代码一:
#include
#include
using namespace std;
int n; //定义棋盘的大小
int s[15]; //存储皇后棋子的位置,s[i]代表第i个皇后在第i行的第s[i]列上
int j,k; //控制循环
int sum; //存储解的个数
int judge(int t)
{
for(int i=1;i<t;i++) //判断该位置的皇后是否与前面的t-1个已经放置的皇后冲突
if((s[t]==s[i])||(t-i)==fabs(s[t]-s[i])) //判断两个棋子是否在同一列或者在它的对角线上
return 0;
return 1;
}
void prepare(int t)
{
if(t>n)
{
sum++;
if(sum<=3)
{
for(int i=1;i<=n;i++)
cout<<s[i]<<" ";
cout<<endl;
}
}
else
{
for(int i=1;i<=n;i++)
{
s[t]=i;
if(judge(t))
prepare(t+1);
}
}
}
int main()
{
cin>>n;
prepare(1);
cout<<sum<<endl;
return 0;
}
代码二:
#include
using namespace std;
int s[5][100];
int ans[20]; //存储皇后的位置
int sum; //存储解的个数
int n; //定义棋盘的大小
int prepare(int t)
{
if(t>n)
{
sum++;
if(sum<=3)
{
for(int i=1;i<=n;i++)
cout<<ans[i]<<" ";
cout<<endl;
}
}
else
{
for(int i=1;i<=n;i++)
{
if((!s[1][i])&&(!s[2][t+i])&&(!s[3][t-i+n])) //判断该棋子的同列和两条对角线上是否有其他的皇后
{
ans[t]=i;
s[1][i]=1;
s[2][t+i]=1;
s[3][t-i+n]=1;
prepare(t+1);
s[1][i]=0; //回溯部分
s[2][t+i]=0;
s[3][t-i+n]=0;
}
}
}
}
int main()
{
cin>>n;
prepare(1);
cout<<sum<<endl;
return 0;
}