所谓回溯(backtracking)是通过系统地搜索求解问题的方法。这种方法适用于类似于八皇后这样的问题:求得问题的一个解比较困难,但是检查一个棋局是否构成解很容易。

不多说,放上n皇后的回溯问题代码:

//Queens.h
#define Queens_H
#ifndef Queeens_H #include <vector>
using namespace std; class Queens
{
public:
Queens(int size); //构造规模为n行n列的空棋盘
bool is_solved() const; //当前棋盘构成解
void print() const; //输出当前棋盘
bool unguarded(int col) const; //在(count,col)处放置皇后没有冲突
void insert(int col); //在(count,col)处放置皇后
void remove(int col); //删除(count,col)处放置的皇后
void solve_from(Queens &configuration); //n皇后问题回溯算法
int board_size; //棋盘规模
private:
int count; //当前棋盘上皇后个数
vector<vector<bool> > queen_square;
}; #endif
//Queens.cpp
#include "Queens.h"
#include <vector>
#include <iostream>
using namespace std; Queens::Queens(int size)
{
queen_square.resize(size);
int i;
for(i = 0;i < queen_square.size();i++)
{
queen_square[i].resize(size);
}
board_size = size;
count = 0; //还没有放置任何皇后
} bool Queens::is_solved() const
{
if(count == board_size)
return true;
else
return false;
} void Queens::print() const
{
cout << "下面是解决" << board_size << "皇后问题的一组解(\"O\"表示该位置有皇后,\"X\"表示给位置无皇后):" << endl;
int i,j;
for(i = 0;i < board_size;i++)
{
for(j = 0;j < board_size;j++)
{
if(queen_square[i][j])
cout << "O " ;
else
cout << "X " ;
}
cout << endl;
}
} bool Queens::unguarded(int col) const
{
//先把当前的坐标表示出来
int x = count;
int y = col;
int i,j;
for(i = 0;i < board_size;i++)
{
if(i != y && queen_square[x][i])
return false;
}
for(j = 0;j < board_size;j++)
{
if(j != x && queen_square[j][y])
return false;
}
for(i = 1;i < board_size;i++)
{
if(x - i >= 0 && x - i < board_size && y - i >= 0 && y - i < board_size)
{
if(queen_square[x-i][y-i])
return false;
}
if(x + i >= 0 && x + i < board_size && y + i >= 0 && y + i < board_size)
{
if(queen_square[x+i][y+i])
return false;
}
if(x + i >= 0 && x + i < board_size && y - i >= 0 && y - i < board_size)
{
if(queen_square[x+i][y-i])
return false;
}
if(x - i >= 0 && x - i < board_size && y + i >= 0 && y + i < board_size)
{
if(queen_square[x-i][y+i])
return false;
}
}
return true;
} void Queens::insert(int col)
{
queen_square[count][col] = true;
count++;
} void Queens::remove(int col)
{
count--;
queen_square[count][col] = false;
} void Queens::solve_from(Queens &configuration)
{
if(configuration.is_solved())
configuration.print();
else
{
for(int col = 0;col < configuration.board_size;col++)
{
if(configuration.unguarded(col))
{
configuration.insert(col); //在(count,col)处放置皇后
solve_from(configuration); //递归,继续求解
configuration.remove(col); //去掉先前在(count,col)处放置的皇后
}
}
}
}
//test.cpp
#include <iostream>
#include "Queens.h"
//#include <vector>
using namespace std; int main()
{
int n = 8; //尝试解决8皇后问题
Queens qq(n);
qq.solve_from(qq);
return 0;
}

回溯算法——解决n皇后问题的更多相关文章

  1. C语言回溯算法解决N皇后问题

    回溯算法的模型是 x++, not satisfy ? x-- : continue. 代码中x作列号,y[x]保存第x列上皇后放置的位置. #include<stdio.h> #incl ...

  2. 回溯算法之n皇后问题

    今天在看深度优先算法的时候,联想到DFS本质不就是一个递归回溯算法问题,只不过它是应用在图论上的.OK,写下这篇博文也是为了回顾一下回溯算法设计吧. 学习回溯算法问题,最为经典的问题我想应该就是八皇后 ...

  3. 算法刷题--回溯算法与N皇后

    所谓回溯算法,在笔者看来就是一种直接地思想----假设需要很多步操作才能求得最终的解,每一步操作又有很多种选择,那么我们就直接选择其中一种并依次深入下去.直到求得最终的结果,或是遇到明细的错误,回溯到 ...

  4. 回溯法解决N皇后问题(以四皇后为例)

    以4皇后为例,其他的N皇后问题以此类推.所谓4皇后问题就是求解如何在4×4的棋盘上无冲突的摆放4个皇后棋子.在国际象棋中,皇后的移动方式为横竖交叉的,因此在任意一个皇后所在位置的水平.竖直.以及45度 ...

  5. 用试探回溯法解决N皇后问题

    学校数据结构的课程实验之一. 数据结构:(其实只用了一个二维数组) 算法:深度优先搜索,试探回溯 需求分析: 设计一个在控制台窗口运行的“n皇后问题”解决方案生成器,要求实现以下功能: 由n*n个方块 ...

  6. C语言:试探算法解决“八皇后”问题

    #include <stdio.h> #define N 4 int solution[N], j, k, count, sols; int place(int row, int col) ...

  7. 8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,循环控制及其优化

    上两篇博客 8皇后以及N皇后算法探究,回溯算法的JAVA实现,递归方案 8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,数据结构“栈”实现 研究了递归方法实现回溯,解决N皇后问题,下面我们来 ...

  8. 回溯算法-C#语言解决八皇后问题的写法与优化

    结合问题说方案,首先先说问题: 八皇后问题:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 嗯,这个问题已经被使用各种语言解 ...

  9. 8皇后以及N皇后算法探究,回溯算法的JAVA实现,递归方案

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

随机推荐

  1. python3+selenium3+requests爬取我的博客粉丝的名称

    爬取目标 1.本次代码是在python3上运行通过的 selenium3 +firefox59.0.1(最新) BeautifulSoup requests 2.爬取目标网站,我的博客:https:/ ...

  2. [二十六]SpringBoot 之 整合log4j

    1.引入log4j依赖 在创建Spring Boot工程时,我们引入了spring-boot-starter,其中包含了spring-boot-starter-logging,该依赖内容就是Sprin ...

  3. 【刷题】LOJ 6000 「网络流 24 题」搭配飞行员

    题目描述 飞行大队有若干个来自各地的驾驶员,专门驾驶一种型号的飞机,这种飞机每架有两个驾驶员,需一个正驾驶员和一个副驾驶员.由于种种原因,例如相互配合的问题,有些驾驶员不能在同一架飞机上飞行,问如何搭 ...

  4. AGC019

    质量果然挺高的. A 贪心. ll Q,H,S,D,N; int main() { cin>>Q>>H>>S>>D>>N; H=min(H, ...

  5. 【BZOJ2655】Calc(拉格朗日插值,动态规划)

    [BZOJ2655]Calc(多项式插值,动态规划) 题面 BZOJ 题解 考虑如何\(dp\) 设\(f[i][j]\)表示选择了\(i\)个数并且值域在\([1,j]\)的答案. \(f[i][j ...

  6. wazuh安装手册

    一.wazhu部署架构 1.服务器上运行的Agent端会将采集到的各种信息通过加密信道传输到管理端. 2.管理端负责分析从代理接收的数据,并在事件与告警规则匹配时触发警报. 3.LogStash会将告 ...

  7. 【django基础之ORM,增删改查】

    一.定义 1.什么是ORM? ORM,即Object-Relational Mapping(对象关系映射),它的作用是在关系型数据库和业务实体对象之间作一个映射,这样,我们在具体的操作业务对象的时候, ...

  8. 手动为容器设置ip地址

    1.安装bridge-utils # aptitude install -y bridge-utils 2.配置网桥 # vim /etc/network/interfaces auto lo ifa ...

  9. Xpack集成LDAP

    支持两种配置方式: The ldap realm supports two modes of operation, a user search mode and a mode with specifi ...

  10. 【DP】【CF1097D】 Makoto and a Blackboard

    更好的阅读体验 Description 给定一个数 \(n\),对它进行 \(k\) 次操作,每次将当前的数改为自己的因数,包括 \(1\) 和自己.写出变成所有因数的概率是相等的.求 \(k\) 次 ...