运行结果

代码如下

 #include <bits/stdc++.h>
using namespace std;
const int MAX = ;
const char *LINE32 = "--------------------------------";
const bool PRINT_DETAILS = false;
long long n, cnt = ;// n表示皇后数量,cnt表示方案数量
int vis[][*MAX+];
//v[0][]、v[1][]、v[2][]分别表示列、主对角线、副对角线是否存在皇后
// 为0时表示无皇后,非0则表示有,且v[0][4]=2表示第四列第二行存在皇后 void print() {
cout << LINE32 << endl;
cout << "第" << cnt << "个方案: " << endl;
for (int i = ; i <= n; i++) {
if (i != ) {
cout << ", ";
}
cout << "(" << vis[][i] << "," << i << ")";
}
cout << endl;
for (int i = ; i <= n; i++) {
for (int j = ; j <= n; j++) {
if (vis[][j] != i) {
cout << 'x';
} else {
cout << 'Q';
}
}
cout << endl;
}
} bool check(int row, int col) {// 检查是否可以在(row,col)这个坐标放置皇后
return !(vis[][col] || vis[][row-col+n] || vis[][row+col]);
}
void place(int x, int y, int *r2c) {// 在(x,y)的位置上放置皇后
vis[][y] = x;
vis[][x-y+n] = vis[][x+y] = ;
r2c[x] = y;
}
void remove(int x, int y) {// 移除(x,y)位置上的皇后
vis[][y] = vis[][x-y+n] = vis[][x+y] = ;
}
void solve(int n) {// 与非递归实现1的不同点在于,A.使用了vis[3][]加快了判断,B.回溯的具体操作是在vis[3][]上而不是r2c[]上
int r2c[n+];// 存放各行所放位置的列数,其实类似于递归实现1和非递归实现1中使用的queen[]
r2c[] = ;// 这里要初始化,否则最后要退出下面的循环时会数组越界,受影响的代码是63_42
int row = , col = ;
place(row, col, r2c);
row = ;//在(1,1)的位置上放置一个皇后,然后进入循环,开始寻找第二行放置的位置
while (row > ) {// row的值最后为0,因为所有情况都检查完时,第一行往上回溯,row值就为0
if (row > n) {
// 找到一个解,之后需要向上回溯:移除上一行的皇后,从上一行的下一列尝试放置皇后
cnt++;
if (PRINT_DETAILS) {
print();
}
row--;// row返回上一行
remove(row, r2c[row]);// 移除上一行中的皇后
col = r2c[row]+;// 此时的(row,col)为下一次尝试放置的位置
} else if (col > n) {
// 当前row行中的每一个位置都尝试并放置了,回溯
row--;
remove(row, r2c[row]);
col = r2c[row]+;
} else if (check(row, col)) {
// 找到一个符合的位置
place(row, col, r2c);// 放置皇后
row++;// 查找下一行放置的位置
col = ;// 并且是从第一列开始放置
} else {
// 这一列不符合,查找下一列
col++;
}
}
} int main() {
// input
cout << "输入皇后个数: ";
cin >> n;
// compute
clock_t begin = clock();
solve(n);
clock_t end = clock();
// output
cout << LINE32 << endl;
cout << n << "皇后问题一共有" << cnt << "种解决方案" << endl;
cout << LINE32 << endl;
cout << "回溯非递归算法实现2 解决" << n << "皇后问题耗时" << /*end-begin << "打点" <<*/(double)(end-begin)/CLOCKS_PER_SEC << "s" << endl;
return ;
}
// 14 3~5s

与回溯递归算法实现2对比

回溯递归算法实现2运行情况

回溯非递归算法实现2运行情况

非递归实现还是比递归实现慢一点,有点不符合预期。

最新文章

  1. java中的小数的取整的几种函数
  2. Android启动icon切图大小
  3. Mina、Netty、Twisted一起学(一):实现简单的TCP服务器
  4. 夺命雷公狗---DEDECMS----21dedecms按照地区取出电影内容
  5. HTML系列(HTMl+CSS+JavaScript+Jquery)--un
  6. ubuntu安装mysql5.7
  7. 基于MySQL协议的数据库中间层项目Atlas - 360团队
  8. 前端UI组件复用工具
  9. (cljs/run-at (JSVM. :all) &quot;细说函数&quot;)
  10. [转载] 运维角度浅谈:MySQL数据库优化
  11. Django项目实践4 - Django网站管理(后台管理员)
  12. Node.js开发Web后台服务
  13. 基础--Linux环境下一键部署 lnmp
  14. EasyUI中tree,Datagrid,pagenation的使用EasyUI中Datagrid和pagenation进行关联时,再次点击pagenation时让表格数据显示的问题
  15. 一统江湖的大前端(3) DOClever——你的postman有点low
  16. android:动态申请权限(一)
  17. Git push 时如何避免出现 &quot;Merge branch &#39;master&#39; of ...&quot;
  18. 如何获取select选中的值
  19. Oracle传输表空间介绍
  20. L1-053 电子汪

热门文章

  1. 详解Redis持久化(RDB和AOF)
  2. 线程间交换数据的Exchanger
  3. B 蒜头君的树
  4. 201771010108-韩腊梅 实验一 软件工程准备—&lt;对软件工程的初步了解&gt;
  5. jdk1.8 新特性之Stream
  6. Spring 中使用 ActiveMQ 笔记
  7. Maven多模块项目+MVC框架+AJAX技术+layui分页对数据库增删改查实例
  8. 打开scratch后蓝屏怎么办
  9. BadMethodCallException : Call to undefined method App\Models\Article::setContainer()
  10. spring boot 异步发送邮件