HDU-2553 N皇后问题

题目链接:N皇后问题

看了好多个关于n皇后问题的博客,看的别人写的都不是很好懂,

算法笔记上有关于这个问题的求解,但是书在学校,看不了啊

翻了好多博客才找到一篇好懂明了的

这是代码:

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
int vis[3][50],a[50];
int n,sum;
void dfs(int row)
{
    int i;
    if(row==n+1)//已经遍历了N行 
    {
        sum++;
        return;
    }
    for(i=1;i<=n;i++)
    {
        if(vis[0][row-i+n]==0&&vis[1][i]==0&&vis[2][row+i]==0)//表示目前这三个方向没有放置棋子 
        {
            vis[0][row-i+n]=vis[1][i]=vis[2][row+i]=1;//标记,假设已经放置 
            dfs(row+1);//遍历下一行 
            vis[0][row-i+n]=vis[1][i]=vis[2][row+i]=0;//返回当前行,并把标记取消 
        }
    }
}
int main()
{
    for(n=1;n<=10;n++)//先打表,不然会超时 
    {
        sum=0;
        memset(vis,0,sizeof(vis));
        dfs(1);
        a[n]=sum;
    }
    int x;
    while(scanf("%d",&x),x)
    {
        printf("%d\n",a[x]);
    }
return 0;
}

画一张图来解释一下这段代码

以这张图为例,这张图中的1、2、3分别对应代码的vis[0][row-i+n]、vis[1][i]、vis[2][row+i]
vis这个二维数组的横坐标是用来区分这三个点的,以免会有重叠。

好吧,我感觉画了一个图还是有点叙述不清,再絮叨一点,要放皇后的时候需要判断放皇后的这个位置对应的三个点是不是已经标记过了,这三个点表示该位置的三个方向上是否有皇后。

在n皇后的基础上,有一个变型的2n皇后问题。

题意是在皇后分为白皇后和黑皇后两种。在放皇后之前,可以选择一个或多个位置标记,标记的地方不可放置皇后。相同颜色的皇后互斥。其实在思路上也挺好解决的,在存在不可放置皇后位置的基础上放白皇后,如果可以将n个白皇后安排妥当,那就在这个基础上安排黑皇后。如果说黑皇后可以安排妥当,那就是符合情况的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值