n皇后问题(C++解决)
2017-05-14 19:38
190 查看
n皇后问题源于8皇后问题。八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。计算机发明后,有多种计算机语言可以解决此问题。
使用一个数组记录每个皇后应该放置的列数,static int locate[20]
统计可以允许n个皇后排列的情况种数,static int sum
当当前层的皇后位置确定后,就递进一层,也是选取下一行作为放置位置的意思。在下一行的位置中找到可以放置皇后的位置。如果直到第n行都可以找到皇后放置的位置,则sum++。然后退回上一层继续寻找允许排列的方案。
确定当前位置是否可以放置皇后,用place(n)函数实现:
bool place(int m){
for(int i = 1; i < m; i++){
if((locate[i] == locate[m])||(abs(m - i) == abs(locate[m] - locate[i])))
return false;
}
return true;
}
递进一层用Back(n)函数实现:
void Back(int m){
if(m > n)sum++;
else{
for(int i = 1; i <= n; i++){
locate[m] = i;
if(place(m))
Back(m + 1);
}
}
}
完整代码如下:
#include <iostream>
#include <stdlib.h>
using namespace std;
static int n, sum = 0;
static int locate[20];
bool place(int m){
for(int i = 1; i < m; i++){
if((locate[i] == locate[m])||(abs(m - i) == abs(locate[m] - locate[i])))
return false;
}
return true;
}
void Back(int m){
if(m > n)sum++;
else{
for(int i = 1; i <= n; i++){
locate[m] = i;
if(place(m))
Back(m + 1);
}
}
}
int main()
{
cout<<"输入你想要的n:"<<endl;
cin>>n;
Back(1);
cout<<n<<"皇后共有"<<sum<<"种解法"<<endl;
return 0;
}
运行结果如下:
使用一个数组记录每个皇后应该放置的列数,static int locate[20]
统计可以允许n个皇后排列的情况种数,static int sum
当当前层的皇后位置确定后,就递进一层,也是选取下一行作为放置位置的意思。在下一行的位置中找到可以放置皇后的位置。如果直到第n行都可以找到皇后放置的位置,则sum++。然后退回上一层继续寻找允许排列的方案。
确定当前位置是否可以放置皇后,用place(n)函数实现:
bool place(int m){
for(int i = 1; i < m; i++){
if((locate[i] == locate[m])||(abs(m - i) == abs(locate[m] - locate[i])))
return false;
}
return true;
}
递进一层用Back(n)函数实现:
void Back(int m){
if(m > n)sum++;
else{
for(int i = 1; i <= n; i++){
locate[m] = i;
if(place(m))
Back(m + 1);
}
}
}
完整代码如下:
#include <iostream>
#include <stdlib.h>
using namespace std;
static int n, sum = 0;
static int locate[20];
bool place(int m){
for(int i = 1; i < m; i++){
if((locate[i] == locate[m])||(abs(m - i) == abs(locate[m] - locate[i])))
return false;
}
return true;
}
void Back(int m){
if(m > n)sum++;
else{
for(int i = 1; i <= n; i++){
locate[m] = i;
if(place(m))
Back(m + 1);
}
}
}
int main()
{
cout<<"输入你想要的n:"<<endl;
cin>>n;
Back(1);
cout<<n<<"皇后共有"<<sum<<"种解法"<<endl;
return 0;
}
运行结果如下:
相关文章推荐
- C++ 解决8皇后问题
- C++/python解决无穷皇后问题
- 回溯法解决N皇后问题
- 解决了DEV-C++输出时一闪而过的问题
- C++实现 八皇后问题及其扩展N皇后问题(经典回溯算法)
- 关于解决c++的一个古怪问题(转)
- 经典的c++下面使用pthread_create问题的解决
- 解决一下C++问题啊
- 解决php soap webservice 用c++ soap调用的问题
- 用c++实现的8皇后问题
- 类抽屉问题的C++解决
- n皇后问题的解决 (QS2算法)
- C++中enum枚举类型成员重名问题的解决方法 - Enum枚举类型的类封装
- 昨晚的C++初级问题的解决!!!!
- N皇后问题的解决
- C/C++与java网络通信问题汇总及解决方法
- 解决c++头文件结构类似嵌套问题
- 非托管C++调用 Webservice,如何解决状态保持的问题
- 这些天很忙,写一个类似防火墙的东西在WINSOCK2 SPI上做DLL,终于把问题解决了,现提供完整C++项目下载
- 链表解决8皇后问题