N皇后问题

问题引入:

八皇后问题

八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。

0N皇后问题 - 蓝桥云课 (lanqiao.cn)

思路:dfs,按照一行到n行顺序放入,判断皇后在列的位置是否合法(写一个函数判断当前皇后所在位置的行和列还有两条对角线上是否存在其他的皇后,若不存在则合法),若不合法,找下个位置,若合法,dfs下一行,当达到终点时,结果加一。

Check函数检查对角线时的规律:

右上对角线:横竖坐标的和为一定值,例:4+1=5,3+2=5,2+3=5,1+4=5......

1,11,21,31,41,51,61,71,8
2,12,22,32,42,52,62,72,8
3,13,23,33,43,53,63,73,8
4,14,24,34,44,54,64,74,8
5,15,25,35,45,55,65,75,8
6,16,26,36,46,56,66,76,8
7,17,27,37,47,57,67,77,8
8,18,28,38,48,58,68,78,8

右下对角线:横竖坐标的差为一定值,例:2-1=1,3-2=1,4-3=1,5-4=1......

1,11,21,31,41,51,61,71,8
2,12,22,32,42,52,62,72,8
3,13,23,33,43,53,63,73,8
4,14,24,34,44,54,64,74,8
5,15,25,35,45,55,65,75,8
6,16,26,36,46,56,66,76,8
7,17,27,37,47,57,67,77,8
8,18,28,38,48,58,68,78,8

C++代码:

#include <iostream>
using namespace std;

int Map[15];//Map[i]表示第i排存放的皇后
int N;
int res;
bool Check(int m,int n)//检查位置Map[m][n]是否能放皇后
{
  for(int i=1;i<=m;i++)
  {
    if(Map[i]==n)//检查列
    return false;
    if(i+Map[i]==m+n)//检查左对角线
    return false;
    if(i-Map[i]==m-n)//检查右对角线
    return false;
  }
  return true;
}

void dfs(int a)
{
  if(a>N)//a==n+1,a==n时还为选完
  {
    res++;
    return;
  }

  for(int i=1;i<=N;i++)//遍历列
  {
    if(Check(a,i))
      {
        Map[a]=i;
        dfs(a+1);
        Map[a]=0;//复原
      }
  }
}
int main()
{
  // 请在此输入您的代码
  cin>>N;
  dfs(1);
  cout<<res;
  return 0;
}

希望对有需要的人能有所帮助,欢迎大家有什么问题到评论区里一起讨论!

  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值