关闭

【算法笔记】回溯法——n皇后问题

474人阅读 评论(0) 收藏 举报
分类:

回溯法——n皇后问题


问题描述

按照国际象棋的规则,皇后可以攻击同一行、同一列、同一斜线上的棋子。
求n×n格的棋盘上彼此不受攻击的n个皇后的摆法。

下图为4皇后问题的一个解:

Q




Q
Q




Q

         图1


解空间

用一维数组x表示n皇后问题的解(数组下标从1开始)。

其中,x[n]表示第n行的皇后放在第x[n]列。

1所对应的数组x为 { 2, 4, 1, 3 }。


算法思想

  1. 逐行放置皇后,对n行,每行放置一个皇后。因此,n个皇后的行不会相同。
  2. 但是,列可能相同,或者放置的皇后会出现在之前放置好的皇后的对角线上。
  3. 所以,放置皇后时,对每一行,遍历每一列,判断该位置是否和先前放置好的皇后位置冲突,若不冲突,放置皇后。

算法代码

#include<iostream>
#include<cmath>
using namespace std;

int n;
int x[1000];

//判断能否放入该位置,即是否和现有的皇后位置冲突,若不冲突,表示可以放置
bool canPlace(int t){
    for(int i = 1; i < t; i++){   //逐个逐个和现有的皇后比较
        if(x[i] == x[t] || abs(t - i) == abs(x[t] - x[i])){  //列相等或在对角线上
            return false;
        }
    }
    return true;
}

void backtrack(int t){  //第t层,即第一行
    if(t > n){
        for(int i = 1; i <= n; i++){
            cout<<x[i]<<" ";
        }
        cout<<endl;
        return;
    }

    for(int i = 1; i <= n; i++){   //从第一列到最后一列,逐个逐个试
        x[t] = i;
        if(canPlace(t)){
            backtrack(t + 1);
        }
    }
}

int main(){
    cin>>n;
    backtrack(1);
    return 0;
}


运行效果



0
0
查看评论

N皇后问题--回溯算法的经典实例

问题描述: 皇后是国际象棋中威力最大的棋子。在下面所示的棋盘上,皇后可以攻击位于箭头所覆盖位置的所有棋子。我们能不能把N个皇后放在棋盘(N×N)上,它们中的任何一个都无法攻击其余的皇后?请编写程序输出皇后的摆放方案,并找出一共有几种方法。 问题分析: 编程即是先找到问题的解决方法,然后...
  • shengabc
  • shengabc
  • 2016-04-11 16:50
  • 4840

回溯法算法步骤&n皇后问题的详细程序(C++)

/* 回溯法有“通用解题法”之称,可以系统的搜索问题的所有解,既有系统性也有跳跃性。 它在问题的解空间树中,按深度优先策略,从根节点出发搜索解空间树。算法搜索至洁空间树 的任一结点时,先判断该结点是否包括该问题的解,如果肯定不包含,则跳过对以该结点为 根的子树的搜索,逐层向其祖先结点回溯;否...
  • zhangchao3322218
  • zhangchao3322218
  • 2012-10-19 18:47
  • 6390

回溯法解决N皇后问题(java实现)

回溯法解决N皇后问题(java实现)
  • qq_22222499
  • qq_22222499
  • 2017-04-30 13:26
  • 652

算法分析与设计回溯法之n皇后问题

问题介绍:在n*n格的棋盘上放置彼此不受攻击的n个皇后。由于皇后可以攻击与之处于同一行或同一列或在同一斜线上的棋子。n皇后问题等价于在n*n的棋盘上放置n个皇后,任何两个皇后不放在同一列或同一行或同一斜线上。 分析:用n元组x[1:n]表示n皇后问题的解。其中,x[i]表示皇后i放在棋盘的第i行的...
  • hello_tomorrow_111
  • hello_tomorrow_111
  • 2017-12-01 22:17
  • 131

回溯法及N皇后问题

回溯法是一种系统地搜索问题解答的方法。在搜索的过程中尝试找到问题的解,如果发现找不到了,就退一步,往上回溯(剪枝过程)。对于许多复杂问题和大规模问题都可以使用回溯法。 回溯法的基本思想是按照深度优先搜索的策略,从根节点开始搜索,当到某个节点时要判断是否是包含问题的解,如果包含就从该节点继续搜索下去...
  • charles1e
  • charles1e
  • 2016-06-12 15:55
  • 1236

华为机试—N皇后问题(高级题160分:两种回溯法解决 吐血整理)

一、问题描述:     在n×n格的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于再n×n的棋盘上放置n个皇后,任何2个皇后不妨在同一行或同一列或同一斜线上。 输入...
  • wtyvhreal
  • wtyvhreal
  • 2015-01-09 16:11
  • 3346

n-皇后问题 C++实现 回溯法

该程序输出所有可行解: /* Function : n-皇后问题的回溯算法 * Author : wyh7280 * Time : 2015.05.20 10:36:00.000 * Note : 输出n-皇后的所有可行解,输出列号(0~n-1) */...
  • wyh7280
  • wyh7280
  • 2015-05-20 11:03
  • 1948

算法分析与设计实验三 回溯法 24点问题 n皇后问题

实验目的 学习编程实现深度优先搜索状态空间树求解实际问题的方法, 着重体会求解第一个可行解和求解所有可行解之间的差别。 加深理解回溯法通过搜索状态空间树、同时用约束函数剪去不含答案状态子树的算法思想, 会用蒙特卡罗方法估计算法实际生成的状态空间树的结点 数。 实验内容 1、 求 24 点问题 给定...
  • wyh7280
  • wyh7280
  • 2015-05-26 12:38
  • 1947

回溯法:八皇后问题

八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为n×n,而皇后个数也变成...
  • T_27080901
  • T_27080901
  • 2015-05-17 12:24
  • 3966

N皇后问题与回溯法

八皇后问题,快三个月了,原来不会写现在还是不会,感觉递归还是不理解,每次看别人的代码都要想一下,更不讲自己写了 这里明显用到了回溯法,这种递归我看看是没问题的,可以说比较简单,但自己写就难了 回溯法要注意一个问题就是:如果在回溯法中用了辅助的全局变量,则一定要把它们恢复原状,特别的,如果函数有多...
  • SeasonJoe
  • SeasonJoe
  • 2015-12-17 22:42
  • 1251
    个人资料
    • 访问:6652次
    • 积分:133
    • 等级:
    • 排名:千里之外
    • 原创:6篇
    • 转载:1篇
    • 译文:0篇
    • 评论:2条
    文章分类
    最新评论