#include <iostream>
using namespace std;
int x[20]; //解向量
int sum; //可行方案个数
int n;
//在第t列是否可放置
bool place(int t){
int i;
for(i=1; i<t; i++)
//如果 行-行 == 列-列 或者 在同一列。
if(abs(t-i) == abs(x[t]-x[i]) || x[i]==x[t])
return false;
return true;
}
//回溯,即递归调用
void backtrack(int t){
//cout << t << endl;
int i;
//到达最后一行,即找到所有解
if(t > n){
sum++;
for(i=1; i<=n; i++)
printf(" %d",x[i]);
printf("\n");
}else{
//从第一行第一列开始,循环到 第一行 第n列
for(i=1; i<=n; i++){
x[t] = i; //对于第t行,第i列,放置皇后.
//判断刚才放置的位置(x[t] = i)是否可行,如果可行,就放置下一行。
//不可行的话,继续在第t行放置
if(place(t)) backtrack(t+1);
}
}
}
int main(){
while(cin >> n){
backtrack(1); //从第1行开始
cout << "方案数:" <<sum << endl; //可行解个数
}
return 0;
}
分享到:
相关推荐
算法设计作业,用c++编写的,回溯法求解n皇后问题 运行环境VC6.0
算法分析与设计,回溯法.。。。。。。。。。。。。。。。。
回溯法求解n皇后问题,n皇后问题是一个非常有意思的游戏
N皇后问题(n-queen problem)是一个经典的组合优化问题,也是一个使用回溯法(backtracking)的典型例子。回溯法是一种系统地搜索问题解的方法。 此文档包含算法分析、代码实现、演示程序、演示界面。
使用分支限界法解决N皇后问题。因为是广度优先,而且占用比较多的额外空间,所以并不是解N皇后问题的很好的算法,主要是理解分支限界法的使用。
回溯实现n后问题,用c语言实现,默认定义皇后个数为五个,可以自己定义,输出排列结果,本程序只是简单的利用回溯法实现五皇后问题,
用回溯法解决N皇后问题,并用C++代码实现
实验要求:结合拉斯维加斯算法和回溯法,求出在不同stepVegas设置下搜索到一个可行解所需搜索的节点数,将可行解和相关搜索的节点数输出。
应用回溯法,当可以放置皇后时就继续到下一行,不行的话就返回到第一行,重新检验要放的列数,如此反复,直到将所有解解出。 也就是对于N×N的棋盘,选择出N个符合i!=r∧j!=s∧|i-r|!=|j-s|∨(i+r)!=(j+s)的点的...
n皇后问题相信大家早已熟悉了,用回溯法解,那是相当的简单。
N皇后的实现方法,回溯法,非递归法,黑板风格,管道风格。等等吧。
以4皇后为例,其他的N皇后问题以此类推。所谓4皇后问题就是求解如何在4×4的棋盘上无冲突的摆放4个皇后棋子。在国际象棋中,皇后的移动方式为横竖交叉的,因此在任意一个皇后所在位置的水平、竖直、以及45度斜线上都...
皇后问题回溯法 place(int k) { int j; for(j=1;j;j++) if((abs(k-j)==abs(x[j]-x[k]))||(x[j]==x[k])) return false; return true; }
这个可以查看到所有n皇后问题的输出和计数~~
使用回溯法解决,不仅解决N皇后问题,任一个皇后矩阵均可输出所有的解。
本文实例讲述了C++基于回溯法解决八皇后问题的方法。分享给大家供大家参考,具体如下: 回溯法的基本做法是搜索,或是一种组织得井井有条的,能避免不必要搜索的...n皇后问题 要在n*n的国际象棋棋盘中放n个皇后,使任意
用回溯法解决N皇后问题,可以输入N的规模,会计算出程序的执行时间,并且输出皇后所能在的正确的位置,直到输出所有解。
这里对于n皇后问题就不做太多的介绍,相关的介绍与算法分析可参考前面一篇C++基于回溯法解决八皇后问题。 回溯法的基本做法是搜索,或是一种组织得井井有条的,能避免不必要搜索的穷举式搜索法。这种方法适用于解...
n*n 格的棋盘上放置彼此不受攻击的N个皇后。有回溯法实现N后问题,
下面给大家分享的是回溯法解八皇后, 带详细注解,这里就不多废话了。 function NQueens(order) { if (order < 4) { console.log('N Queens problem apply for order bigger than 3 ! '); return; } var n...