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

更新时间:2024-03-06 14:33:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

八皇后问题

一、 设计任务与目标

在8行8列的棋盘上放置8个皇后,皇后可吃掉与她处于同行或同列或同一对角线上的其他棋子,要使任一个皇后都不能吃掉其他的7个皇后,则需要同时控制同行,同列,同一条对角线的情况,然后当行,列,以及对角线都无皇后时,记录该点。并用“Q”表示皇后的位置,“+”表示其它位置。

二、 方案设计与论证

定义4个具有全局作用域的数组int LineNum[9]; bool a[9], b[15]分别表示第几列的皇后要放的行位置,第几行上是否未放皇后,“/”斜对角线上是否未放皇后,“\\”反斜对角线上是否未放皇后。通过语句“if ( a[j] && b[i+j-2] && c[i-j+7] ) LineNum[i]=j;”判断并实现一枚皇后是否放置安全。然而当第一枚皇后位置放置后,则它所在的行,列,以及对角线的记录状态需要改变后,才能进行下一枚皇后的放置。下一枚皇后判断位置的步骤与第一枚一样,所以可以用递归的方法进行下一枚皇后位置的放置。当第8枚皇后的位置确定后,就跳出递归。之后还要对之前每一个位置记录的情况初始化才能进行下一种放置八皇后的情况。

三、程序框图或流程图,程序清单与调用关系

Int i=1

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; c[i-j+7]=true;

否 i<2 是

四、全部源程序清单

# include #include

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<<\

}

else

cout<<\

}

cout<

for( m=1; m<9; m++)

{ }

for(int n=1; n<9; n++) { }

if(LineNum[m] == n) {

cout<<\}

cout<

// system(\暂停以查看结果

} }

void 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<<\一共有\种方法。\}

五、程序运行的测试与分析

运行结果正确。

六、结论与心得

1. 设计中遇到的问题及解决过程

调试过程中出现一些逻辑和语法错误,但是语法错误容易纠正,而 逻辑错误则比较难纠正。有时会漏掉“,”,“;”,“}”等符号 2. 设计体会和收获。

发现自己也能解决有点复杂的问题。例如如何使用递归函数,以及如何将数据与数据相关的操作关联在一起并封装起来。

七、参考资料

面向对象程序设计 Visual C++

八、致谢

真诚地感谢编者,解决了实验上遇到的问题。

本文来源:https://www.bwwdw.com/article/g4aa.html

Top