概率算法实现八皇后问题-cpp
时间:2020-04-26
本文章向大家介绍概率算法实现八皇后问题-cpp,主要包括概率算法实现八皇后问题-cpp使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
找出 n=12~20 时最优的 StepVegas值
#include <ctime>
#include <float.h>
#include <iomanip>
#include <iostream>
#include <math.h>
#include <random>
#include <set>
#include <vector>
using namespace std;
int N = 12;
bool backtrace(int &k, set<int> &col, set<int> &diag45, set<int> &diag135, bool &success, vector<int> &placeCol);
void QueensLv(bool &success, const int stepVegas);
int main()
{
bool success = false;//记录一次QueensLv函数调用是否放置皇后成功
clock_t start, finish;//记录起止时间
double duration = 0.0;//记录耗时
int FailCnt = 0;//记录执行1000次八皇后放置成功期间的失败次数
//循环N:12-20
while (N <= 20)
{
//stepVagas循环0-N
for (int stepVegas = 1; stepVegas < N; stepVegas++)
{
FailCnt = 0;
//循环执行成功1000次;
int loopInt = 1000;
start = clock();
while (loopInt--)
{
success = false;
while (!success)
{
QueensLv(success, stepVegas);
if (!success)
FailCnt++;
}
}
finish = clock();
//循环执行1000次成功的时间
duration = (double)(finish - start) / CLOCKS_PER_SEC;
cout << "N = " << setw(3) << setiosflags(ios::left) << N;
cout << " StepVegas = " << setw(3) << setiosflags(ios::left) << stepVegas;
cout << " Fail times = " << setw(6) << setiosflags(ios::left) << FailCnt;
cout << " spend Time = " << setw(6) << setiosflags(ios::left) << duration << " s" << endl;
}
cout << endl;
N++;
}
return 0;
}
bool backtrace(int &k, set<int> &col, set<int> &diag45, set<int> &diag135, bool &success, vector<int> &placeCol)
{
int i = 1;
int startK = k;
while (k <= N && k >= startK)
{
while (i <= N)
{
//不同列,不在45度角,不在135度角
if ((!col.count(i)) && (!diag45.count(i - k)) && (!diag135.count(i + k)))
{
//放置皇后
placeCol[k] = i; //记录第k行,j列已经放置皇后
col.insert(i);
diag45.insert(i - k);
diag135.insert(i + k);
//更新行
k++;
i = 1;
break;
}
i++;
}
if (i > N)
{
//移去皇后
k--;
//移去改行放置的皇后
col.erase(placeCol[k]);
diag45.erase(placeCol[k] - k);
diag135.erase(placeCol[k] + k);
i = placeCol[k] + 1;//以该皇后所在列的下一列作为当前列
placeCol[k] = 0;//将前一行,j列已经放置皇后恢复
}
}
//回溯结束条件
if (k == N + 1)
success = true;
else
success = false;
return success;
}
void QueensLv(bool &success, const int stepVegas)
{
set<int> col, diag45, diag135;
int k = 1, nb = 0, j = 0;
vector<int> placeCol(N + 1, 0);
srand(time(0));
while (k <= stepVegas)//随机放置的皇后数
{
nb = 0;//记录当前皇后可以放置的有效位置数量
vector<int> effectivePos;//记录当前行可以放置的皇后位置
for (int i = 1; i <= N; i++)
{
if ((!col.count(i)) && (!diag45.count(i - k)) && (!diag135.count(i + k)))
{
nb++;
effectivePos.push_back(i);
}
}
if (nb > 0)
{
int pos = rand() % nb;
j = effectivePos[pos];//随机选择一个有效位
//放置皇后
placeCol[k] = j;
col.insert(j);
diag45.insert(j - k);
diag135.insert(j + k);
k++;//开始放置下一行
success = true;
}
else if (nb == 0)
{
success = false;
return;
}
}
if (nb > 0 || stepVegas == 0)//stepVegas为0,纯回溯
{
success = backtrace(k, col, diag45, diag135, success, placeCol);
}
else
success = false;
return;
}
原文地址:https://www.cnblogs.com/Alexkk/p/12778774.html
- Why to do,What to do,Where to do 与 Lambda表达式!
- Cloak ; Dagger攻击:一种可针对所有版本Android的攻击技术(含演示视频)
- 实例探究字符编码:unicode,utf-8,default,gb2312 的区别
- 分布式计算,WCF+JSON+实体对象与WebService+DataSet效率大比拼
- 【自然框架】 页面里的父类—— 改进和想法、解释
- 线性神经网络
- 【数据可视化】深度解析大数据可视化设计案例分析
- 使用IE6看老赵的博客——比较完美版(可以在线查看、回复)
- 【Python环境】R vs Python:硬碰硬的数据分析
- 使用IE6看老赵的博客——jQuery初探
- matlab GUI基础8
- 见到了“公司”定义一个Company类,那么见到了“字段”是不是也可定义一个Column类?
- 再论桥接模式(上)纸上谈兵
- 反馈型神经网络
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 一个安卓App,如何成为DuerOS 上的技能应用呢?
- 什么是SPU、SKU、SKC、ARPU
- C++判断类型的模板
- 强化学习/增强学习/再励学习介绍 | 深度学习 | 干货分享 | 解读技术
- Spring Security 初始化流程梳理
- 聊聊dubbo-go的kubernetesRegistry
- QMake复制文件/目录方法
- 计算FPS小例子
- 解读技术 |学习率及其如何改善深度学习算法
- MySQL 5.7 新特性:Generated Column
- 聊聊dubbo-go的nacosRegistry
- 聊聊dubbo-go的PrometheusReporter
- 聊聊dubbo-go的apolloConfiguration
- 聊聊dubbo-go的DefaultHealthChecker
- 一文搞懂matplotlib中的颜色设置