n皇后问题

题目链接:洛谷n皇后例题
(不是只针对题目而整理的代码,下面的代码可能过不了上面洛谷的题目)

其实写这篇博客只要还是加深一下自己对于dfs的印象和理解,也方便以后自己回顾

题目描述:

一个如下的 6×6 的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行、每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子。
n皇后问题_第1张图片
上面的布局可以用序列 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;
}

你可能感兴趣的:(洛谷)