C++解决八皇后问题
2013-04-09 22:24
197 查看
直接上代码,可以自己慢慢研究
#include <iostream> #include <stdlib.h> using namespace std; int LineNum[9]; //第i列的皇后要放的行位置(只用其中的列号1到8) bool a[9]; //a[i]为1表示第i行上尚未放皇后 bool b[15]; //b[i]为1表示第i条斜对角线上尚未放皇后(斜对角线指的是"/"状对角线,该对角线上各点的行列号之和i+j为一个常数) bool c[15]; //c[i]为1表示第i条反斜对角线上尚未放皇后(反斜对角线指的是"\"状对角线,该对角线上各点的行列号之差i-j为一个常数)。 int num=0; //计数器,用于计算方法总数 class bahuanghou { int i; public: bahuanghou(int x) { i=x; } void solve(int); }; void bahuanghou::solve(int i) { int j; for(j=1;j<9;j++) { if(a[j]&&b[i+j-2]&&c[i-j+7]) //用于判断并实现:如果在第j行的第i列上放置皇后安全的话,则将一枚皇后放置到那儿。 { LineNum[i]=j; //记录皇后位置 a[j]=false; b[i+j-2]=false; c[i-j+7]=false; solve(i+1); a[j]=true; b[i+j-2]=true; c[i-j+7]=true; } } if(i>8) //摆放皇后之后,若i=8即已放满时则递归出口;否则通过solve(i+1);进行递归调用。 { num++; for(int m=1; m<9; m++) { for(int n=1; n<9; n++) { if(LineNum[m] == n) cout<<" Q"; else cout<<" +"; } cout<<endl; } for(int m=1; m<9; m++) { for(int n=1; n<9; n++) { if(LineNum[m] == n) { cout<<"("<<m<<","<<n<<")"<<"\t"; } } } cout<<endl; // system("pause"); //暂停以查看结果 } } int main() { bahuanghou huanghou(1); int i; for(i=0;i<9;i++) //初始化一个"空棋盘" { a[i]=true; } for(i=0;i<15;i++) { b[i]=true; c[i]=true; } huanghou.solve(1); //第1列开始的连续8列上均放上皇后 cout<<"一共有"<<num<<"种方法。"<<endl; return 0; }
相关文章推荐
- C++解决八皇后问题
- C++解决八皇后问题
- c++ 深度优先算法解决八皇后问题
- 八皇后问题之C++解决
- C++基于回溯法解决八皇后问题示例
- 运用全排列的方法解决八皇后问题
- C++/Qt程序编译运行时出现的问题以及解决办法
- C++ SendMessage()乱码问题解决
- C++培训_006_函数_数组_字符串_解决实际问题
- Windows平台下C++插件系统实现的几个关键技术问题及其解决思路
- C++简单实现八皇后问题
- VS2010使用C++/CLI编程窗口无法显示问题解决方法
- c/c++服务器程序内存泄露问题分析及解决
- [C++基础]cout与wcout,printf与wprintf,ofstream与wofstream关于输出中文的问题解决
- 回溯法解决八皇后问题--精简版
- c/c++ MAP遇到的两个问题及解决办法
- C++解决最大子列和问题,算法时间复杂度优化
- 【算法】用Lua解决八皇后的问题
- 初次使用VS2010基于C++开发项目碰到的问题及解决方法
- 一个运动学逆问题的matlab和C++解决