蓝桥--2n皇后问题(递归)--搬运+整理+注释

N皇后问题:

 1 #include <iostream>
 2 #include <cmath>
 3 using namespace std;
 4
 5 int N;
 6 int queenPos[100];//用来存放算好的皇后位置。最左上角是(0,0)
 7
 8 void NQueen(int k);
 9
10 int main()
11 {
12     cin >> N;
13     NQueen(0); //从第0行开始摆皇后
14     return 0;
15 }
16 void NQueen(int k) //在0~k-1行皇后已经摆好的情况下,摆第k行及其后的皇后
17 {
18     int i;
19     if (k == N) // N 个皇后已经摆好
20     {
21         for (i = 0; i < N; i++)
22             cout << queenPos[i] + 1 << " ";
23         cout << endl;
24         return;
25     }
26     for (i = 0; i < N; i++)//逐一尝试第k个皇后所在的列i.
27     {
28         int j;
29         for (j = 0; j < k; j++)
30         {
31             //和已经摆好的 k个皇后的位置比较,看是否冲突
32             //queenPos[j] == i表示第j个皇后所在的列queenPos[j]与第k个皇后所在的列i相等
33             //abs(queenPos[j] - i) == abs(k-j)表示第k个皇后和第j个皇后在同一个斜线(行之差与列之差绝对值相等)
34             if (queenPos[j] == i || abs(queenPos[j] - i) == abs(k - j))
35             {
36                 break; //冲突,则试下一个位置
37             }
38         }
39         if (j == k)  //当前选的位置 i 不冲突
40         {
41             queenPos[k] = i; //将第k个皇后摆放在第i列
42             NQueen(k + 1);
43         }
44     } //for( i = 0;i < N;i ++ )
45 }

2N皇后:

#include<iostream>
#include<math.h>
using namespace std;
#define N   100
int wq[N];           //whitequeen,黑皇后位置
int bq[N];           //blackqueen,白皇后位置
int cb[N][N];        //chessboard,棋盘
int num;             //皇后数目
int count = 0;       //不同放置情况计数

int bqueen(int pos)  //黑色皇后放置
{
    int i;
    for (i = 0; i < pos - 1; i++)
    {
        int judge = bq[i] - bq[pos - 1];
        if (0 == judge || abs(judge) == abs(pos - 1 - i))
            return 0;
    }
    if (pos == num)
    {
        ::count++;
        return 0;
    }

    for (int i = 0; i < num; i++)
    {
        if (i != wq[pos] && cb[pos][i])
        {
            bq[pos] = i;
            bqueen(pos + 1);
        }
    }
}
int wqueen(int pos) //白色皇后放置
{
    int i;
    for (i = 0; i < pos - 1; i++)//处理之前置入的皇后,判断是否冲突,冲突就返回,同时貌似放在这边还能使递归能返回,很巧妙,博主我只是搬运
    {
        int judge = wq[i] - wq[pos - 1];
        if (0 == judge || abs(judge) == abs(pos - 1 - i ))
            return 0;
    }

    //当前的pos意为已经有pos个放好了,这次函数在处理pos+1的调用
    if (pos == num)//放满了才会调用
    {
        bqueen(0);
        return 0;
    }

    for (int i = 0; i < num; i++)
    {
        if (cb[pos][i])//该位置是否能放,能放的话,每一个都试一下,如果不行,会返回0----当前不判断的是否能放,由N+1
                       //来查看N次是否能放,不能放就会返回0
        {
            wq[pos] = i;
            wqueen(pos + 1);
        }

    }
}

int main()
{
    cin >> num;
    for (int i = 0; i < num; i++)
        for (int j = 0; j < num; j++)
            cin >> cb[i][j];
    wqueen(0);//先白后黑
    cout << ::count;
    return 0;
}

原文地址:https://www.cnblogs.com/working-in-heart/p/10585223.html

时间: 2024-10-13 14:30:01

蓝桥--2n皇后问题(递归)--搬运+整理+注释的相关文章

对八皇后的补充以及自己解决2n皇后问题代码

有了上次的八皇后的基础.这次准备解决2n皇后的问题,: //问题描述// 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行.//同一列或同一条对角线上,任意的两个白皇后都不在同一行.同一列或同一条对角线上.问总共有多少种放法?n小于等于8.//输入格式// 输入的第一行为一个整数n,表示棋盘的大小.// 接下来n行,每行n个0或1的整数,如果一个整数为1,表示对应的位置可以放皇后,如果一个整数为0,表示对应的位置不可以放皇

2n皇后问题

在蓝桥杯基础训练题中,出现这样一道题目: 问题描述 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行.同一列或同一条对角线上,任意的两个白皇后都不在同一行.同一列或同一条对角线上.问总共有多少种放法?n小于等于8. 输入格式 输入的第一行为一个整数n,表示棋盘的大小. 接下来n行,每行n个0或1的整数,如果一个整数为1,表示对应的位置可以放皇后,如果一个整数为0,表示对应的位置不可以放皇后. 输出格式 输出一个整数,表示总

八皇后问题——递归+回溯法

八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 高斯认为有76种方案.1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果. 求解过程: 采用遍历的办法,就是采用将每种情况都验证的办法最终找出问题的解,但是蛮力遍历的话,需要遍历的数据量太大,计算时间花费太大,所以在遍历

[LeetCode系列]N皇后问题递归解法 -- 位操作方式

N皇后问题: 给定8*8棋盘, 放置n个皇后, 使其互相不能攻击(即2个皇后不能放在同一行/列/正反对角线上), 求解共有多少种放置方式? 这个问题的解答网上有不少, 但是位操作解法的我看到的不多. 下面贴出代码和图解, 也就不赘述了. 1 class Solution { 2 public: 3 /* 使用位操作实现的回溯算法. 按行扫描, 检测可以放置的列. 4 * 'limit' - 都是 '1'. 代表着所有列都被占据了 5 * 'h' - 是目前所有皇后列在行上的垂直投影. 如果 h=

蓝桥杯训练 2n皇后

问题描述 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行.同一列或同一条对角线上,任意的两个白皇后都不在同一行.同一列或同一条对角线上.问总共有多少种放法?n小于等于8.输入格式 输入的第一行为一个整数n,表示棋盘的大小. 接下来n行,每行n个0或1的整数,如果一个整数为1,表示对应的位置可以放皇后,如果一个整数为0,表示对应的位置不可以放皇后.输出格式 输出一个整数,表示总共有多少种放法.样例输入41 1 1 11 1

[蓝桥杯][基础练习VIP]2n皇后问题

时间限制: 1Sec 内存限制: 128MB 提交: 26 解决: 18 题目描述 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行.同一列或同一条对角线上,任意的两个白皇后都不在同一行.同一列或同一条对角线上.问总共有多少种放法?n小于等于8. 输入 输入的第一行为一个整数n,表示棋盘的大小. 接下来n行,每行n个0或1的整数,如果一个整数为1,表示对应的位置可以放皇后,如果一个整数为0,表示对应的位置不可以放皇后. 输

java实现八皇后问题(递归和循环两种方式)

循环方式: package EightQueens; public class EightQueensNotRecursive { private static final boolean AVAILABLE = true; private int squares = 8, norm = squares - 1; private int positionInRow[] = new int[squares]; private int p=-1; private boolean[] rows = n

八皇后问题递归代码

听了下别人的讲解后,最后仔细理解了下所谓的八皇后问题. 怎么说呢,感觉有点像搜索的做法. #include<stdio.h> int count=0; //row行,j列: int notDanger(int row,int j,int (*chess)[8]){ int i,k,flag1=0,flag2=0,flag3=0,flag4=0,flag5=0; //注意这里row与j不能直接使用: //判断列的方向有无危险: for(i=0;i<8;i++){ if(*(*(chess+

N皇后问题——递归求解

比较简单,废话不说,上代码: public class NQueen { //比如:position[1]=3,表示第一行的第三列有一个皇后 private int [] position; //总的方法数量 private int total; private int numOfQueens; public NQueen(int n) throws Exception { if(n<0) throw new Exception("can not be negative...")