C++八皇后问题进行求解源码及流程图
在8行8列的棋盘上放置8个皇后,使任一个皇后都不能吃掉其他的7个皇后(注:皇后可吃掉与她处于同行或同列或同一对角线上的其他棋子),并将结果以某种方式显示出来。
程序执行的结果:
4.3概要设计:
本程设计思路: (1) 通过“int LineNum[9]; bool a[9], b[15], c[15];”说明具有全局作用域的4个数组。其中的:
LineNum[i]表示第i列的皇后要放的行位置(只用其中的列号1到8);
a[i]为true(i =1,2,…,8)表示第i行上尚未放皇后;
b[i]为true(i =0,1,2,…,14)表示第i条斜对角线上尚未放皇后(斜对角线指的是“”状对角线,该对角线上各点的行列号之和i+j为一个常数);
c[i]为true(i=0,1,2,…,14)表示第i条反斜对角线上尚未放皇后(反斜对角线指的是“\”状对角线,该对角线上各点的行列号之差i-j为一个常数)。
从而当使用语句“if ( a[j] && b[i+j-2] && c[i-j+7] ) LineNum[i]=j;”时,可用于判断并实现:如果在第j行的第i列上放置皇后安全的话,则将一枚皇后放置到那儿。
(2)编制一个具有如下原型的递归函数solve,它负责往第i列开始的连续8-i+1列上均放上皇后,若成功则通过引用参数ok返回true(否则返回false)。
void solve(int i, bool& ok);
摆放皇后之后,若i=8即已放满时则递归出口;否则通过solve(i+1,ok);进行递归调用。
程序流程图(如左图):
4.3 详细设计与编码:
见上传程序。
4.4 调试分析:
正确设置各皇后的势力范围,是本题关键 ,同时要注意回溯时要消除未考虑的皇后的势力影响
4.5 用户使用说明:
输出8皇后的92种解法
3.6 设计心得:
本体运用了势力范围图和回溯的方法,可以修改消除递归,同时可以增加限定函数优化回溯。
#include <iostream>
using namespace std;
int f(unsigned long x, int n, int& Lxn)
{
int num[20]={-1};
for(int j=0;j<20;j++)
{
num[20-j-1]=x%10;
x=x/10;
原文请找腾讯752018766优,文-论'文.网http://www.youerw.com if(length<n)
{
Lxn=0;
return 0;
}
else
{
Lxn=num[19-length+n];
return num[20-n];
}
}
int main()
{
unsigned long x;
int n;
int Lxn,Rxn;
cout <<"请输入 x 和 n 的值:";
cin >>x>>n;
Rxn=f(x,n,Lxn);
cout <<"执行语句Rxn=f(x,n,Lxn);之后,Rxn="<<Rxn<<",Lxn="<<Lxn<<endl;
return 0;1812