c八皇后问题 课 程 设 计 报 告

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
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( m=1; m<9; m++)
{
}for(int n=1; n<9; n++)
真诚地感谢编者,解决了实验上遇到的问题。
{
}if(LineNum[m] == n)
{
cout<<"("<<m<<","<<n<<")"<<"\t";
}
cout<<endl;
//system("pause"); //暂停以查看结果
}
}
void main()
{
bahuanghou huanghou(1);
int i;
for(i=0;i<9;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);进行递归调用。
Int iHale Waihona Puke Baidu1
i>8
否是
Int j=1;

j<9
是j++
输出并显示八皇后摆放情况a[j]&&b[i+j-
2]&&c[i-j+7]
是否跳出递归j++
LineNum[i]=j;
a[j]=false;
b[i+j-2]=false;
c[i-j+7]=false;
i++;i--a[j]=true;b[i+j-2]=true;
八皇后问题
一、设计任务与目标
在8行8列的棋盘上放置8个皇后,皇后可吃掉与她处于同行或同列或同一对角线上的其他棋子,要使任一个皇后都不能吃掉其他的7个皇后,则需要同时控制同行,同列,同一条对角线的情况,然后当行,列,以及对角线都无皇后时,记录该点。并用“Q”表示皇后的位置,“+”表示其它位置。
二、方案设计与论证
调试过程中出现一些逻辑和语法错误,但是语法错误容易纠正,而
逻辑错误则比较难纠正。有时会漏掉“,”,“;”,“}”等符号
2.设计体会和收获。
发现自己也能解决有点复杂的问题。例如如何使用递归函数,以及如何将数据与数据相关的操作关联在一起并封装起来。
七、参考资料
面向对象程序设计Visual C++
八、致谢
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列上放置皇后安全的话,则将一枚皇后放置到那儿。
c[i-j+7]=true;否
i<2是
四、全部源程序清单
# include <iostream.h>
#include <stdlib.h>
int LineNum[9]; //第i列的皇后要放的行位置(只用其中的列号1到8)bool a[9]; //a[i]为1表示第i行上尚未放皇后
boolb[15]; //b[i]为1表示第i条斜对角线上尚未放皇后(斜对角线指的是"/"状对角线,该对角线上各点的行列号之和i+j为一个常数)boolc[15]; //c[i]为1表示第i条反斜对角线上尚未放皇后(反斜对角线指的是"\"状对角线,该对角线上各点的行列号之差i-j为一个常数)。
{
a[i]=true;
}
for(i=0;i<15;i++)
{
b[i]=true;
c[i]=true;
}
huanghou.solve(1); //第1列开始的连续8列上均放上皇后
cout<<"一共有"<<num<<"种方法。"<<endl;
}
五、程序运行的测试与分析
运行结果正确。
六、结论与心得
1.设计中遇到的问题及解决过程
定义4个具有全局作用域的数组int LineNum[9]; bool a[9], b[15]分别表示第几列的皇后要放的行位置,第几行上是否未放皇后,“/”斜对角线上是否未放皇后,“\”反斜对角线上是否未放皇后。通过语句“if(a[j]&&b[i+j-2]&&c[i-j+7])LineNum[i]=j;”判断并实现一枚皇后是否放置安全。然而当第一枚皇后位置放置后,则它所在的行,列,以及对角线的记录状态需要改变后,才能进行下一枚皇后的放置。下一枚皇后判断位置的步骤与第一枚一样,所以可以用递归的方法进行下一枚皇后位置的放置。当第8枚皇后的位置确定后,就跳出递归。之后还要对之前每一个位置记录的情况初始化才能进行下一种放置八皇后的情况。三、程序框图或流程图,程序清单与调用关系
相关文档
最新文档