当前位置: 首页 > news >正文

(算法)N皇后问题

题目:

八皇后问题:在8 X 8的国际象棋上摆放八个皇后,使其不能相互攻击,即任意两个皇后不得处于同一行,同一列或者同意对角线上,求出所有符合条件的摆法。

思路:

1、回溯法

数据结构:

由于8个皇后不能处在同一行,那么肯定每个皇后占据一行,这样可以定义一个数组A[8],数组中第i个数字,即A[i]表示位于第i行的皇后的列号。

满足条件:任意两个皇后不同列,即A[i]!=A[j],任意两个皇后不在同一对角线上,即abs(i-j)!=abs(A[i]-A[j])。

算法:

回溯法,通过深度遍历的形式枚举数组A的所有排列组合,并通过剪枝的形式(判断是否满足上述的条件)来减少不必要的计算量,详见代码。

2、全排列法

思路与字符串排列一样http://www.cnblogs.com/AndyJee/p/4655485.html,只是还需要对每一种排列做判断。

数据结构:

8个皇后不能处在同一行,那么肯定每个皇后占据一行,这样可以定义一个数组A[8],数组中第i个数字,即A[i]表示位于第i行的皇后的列号,先把数组A[8]分别用0-7初始化。

满足条件:由于我们用0-7这7个不同的数字初始化数组,因此任意两个皇后肯定也不同列,那么我们只需要判断每个排列对应的8个皇后中是否有任意两个在同一对角线上即可,即对于数组的两个下标i和j,如果i-j==A[i]-A[j]或i-j==A[j]-A[i],则认为有两个元素位于了同一个对角线上,则该排列不符合条件。

思路:

参考字符串排列:

求整个字符串的排列,可以分成两步:首先求所有可能出现在第一个位置的字符,即把第一个字符和后面的所有字符交换;然后固定第一个字符,求后面所有字符的排序。此时仍把后面的字符看成两部分,第一个字符和后面的字符,然后重复上述步骤。(递归)

然后判断每一种排列是否满足上述添加即可。

代码:

1、回溯法

#include <iostream>
#include <vector>
#include <stdlib.h>

using namespace std;
int count=0;

bool canPlace(int index,const vector<int> &result){
    for(int i=0;i<index;i++){
        if(result[index]==result[i] || abs(index-i)==abs(result[index]-result[i]))
            return false;
    }
    return true;
}

void queen(int index,vector<int> &result,int N){
    if(index==N){
        for(int i=0;i<N;i++)
            cout<<result[i]<<" ";
        cout<<endl;
        count++;
        return;
    }
    for(int i=0;i<N;i++){
        result[index]=i;
        if(canPlace(index,result))
            queen(index+1,result,N);
    }
}


int main()
{
    int n=8;
    vector<int> result;

    for(int i=0;i<n;i++)
        result.push_back(i);
    queen(0,result,n);
    cout<<count<<endl;
    return 0;
}

2、全排列法

#include <iostream>
#include <vector>
#include <stdlib.h>

using namespace std;
int count=0;

void swap(int *a,int *b){
    int tmp=*a;
    *a=*b;
    *b=tmp;
}

void queen_permutation(vector<int> &result,int index,int len){
    bool can=true;
    if(index==len-1){
        for(int i=0;i<len;i++){
            for(int j=i+1;j<len;j++){
                if(i-j==result[i]-result[j] || i-j==result[j]-result[i]){
                    can=false;
                    break;
                }
            }
            if(can==false)
                break;
        }
        if(can){
            for(int i=0;i<len;i++)
                cout<<result[i];
            cout<<endl;
            count++;
        }
    }
    else{
        for(int i=index;i<len;i++){
            swap(result[index],result[i]);
            queen_permutation(result,index+1,len);
            swap(result[index],result[i]);
        }
    }
}


int main()
{
    int n=8;
    vector<int> result;

    for(int i=0;i<n;i++)
        result.push_back(i);
    queen_permutation(result,0,n);
    cout<<count<<endl;
    return 0;
}

 

相关文章:

  • 不懂这几点就落后了:Android、Python工程师必读!
  • 设计模式 (23种)
  • 为RemoteApp的登录用户(域用户)添加输入法的方法
  • Exchange Server 2016预览版自动化部署及简单体验
  • 算法25-----位运算(2)-----案例
  • comparator接口与Comparable接口的区别
  • JS结构
  • Centos7 yum安装Chrome浏览器
  • NIS 服务器
  • nmap基本使用方法
  • 布局
  • 我的Android进阶之旅------Android关于ImageSpan和SpannableString的初步了解
  • 给予MP2456的DC-DC降压电源设计
  • 比较规范的身份证号验证正则表达式
  • js call、apply、bind
  • JavaScript-如何实现克隆(clone)函数
  • 2017-08-04 前端日报
  • 2018一半小结一波
  • 345-反转字符串中的元音字母
  • exports和module.exports
  • Fastjson的基本使用方法大全
  • Git学习与使用心得(1)—— 初始化
  • java概述
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • JS实现简单的MVC模式开发小游戏
  • mockjs让前端开发独立于后端
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • redis学习笔记(三):列表、集合、有序集合
  • Redis字符串类型内部编码剖析
  • 包装类对象
  • 电商搜索引擎的架构设计和性能优化
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 理清楚Vue的结构
  • 聊聊sentinel的DegradeSlot
  • 免费小说阅读小程序
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 浅谈Golang中select的用法
  • 手写双向链表LinkedList的几个常用功能
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ​ubuntu下安装kvm虚拟机
  • #每日一题合集#牛客JZ23-JZ33
  • $.ajax,axios,fetch三种ajax请求的区别
  • $.each()与$(selector).each()
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (附源码)计算机毕业设计ssm电影分享网站
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (一)u-boot-nand.bin的下载
  • (转) 深度模型优化性能 调参
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • (转)Oracle 9i 数据库设计指引全集(1)