八皇后问题课程设计说明书.docVIP

  • 22
  • 0
  • 约1.07万字
  • 约 19页
  • 2017-09-16 发布于广东
  • 举报
课程设计说明书 NO.1 八皇后问题 一 课程设计目的通过对一些实际问题的分析,加深理解,将课本的理论运用到实践中,提高独立思考和理解问题的能力,加强动手能力,增加学习心得。FindQueens(int i),设有一个参数i, 表示在1至i-1行都已有皇后合理放置的情况下,寻找第i行的合理放置。在i行上,有8种可能的放置,列iColumn顺次选择第1列、第2列……直至第8列。当i行iColumn列的放置是合理的时候,就设置与i行iColumn列相对应的列、斜线有皇后的标志,并在i=7(i从0开始计算)的情况下,输出解;否则递归调用FindQueens(i+1),在第i+1行上寻找合理的放置。一列试探结束,再试探下一列之前,清除已设置的与i行iColumn列相对应的列、斜线有皇后的标志,让iColumn增加1,在下一列寻找解。 要关心的是一个皇后是否已经合理的沿着每一行、每一列的斜线安置。因此在每一列上恰好安置一个皇后,引入一个二维数组(设数组为Queen[ ][]),Queen[i][iColumn]表示在棋盘的第i行、第iColumn列方格上有一个皇后。另外,为了使程序在检查皇后放置的合理性 方面简易方便,引入以下三个工作数组(k仅代表其中一个元素): 数组a[ ],a[k]=1表示第k列上有皇后; 数组b[ ],b[k]=1表示第k条主对角线上有皇后; 数组c[ ],c[k]=1表示第k条反对角线上有皇后; 棋盘中的行与列有如下规律: 同一条主对角线上的方格,它们的行号与列号之间的关系:i-iColumn+7均相等; 同一条反对角线上的方格,它们的行号与列号之间的关系:i+iColumn均相等。 初始化时,所有行和斜线上均没有皇后。在第i行的iColumn列方格放置一个合理的皇后后,准备考察第i+1行时,应在数组a[ ],b[ ],c[ ]中为第i行、第iColumn列的方格设定有皇后的标志;如果前次的皇后放置导致后面的放置无论如何都不能满足要求,则回溯,重置,这时,应先清除原先在数组a[ ],b[ ],c[ ]中设置的关于第i行、第iColumn列有皇后的标志;一个皇后在第i行、第iColumn列方格内放置是合理的,由数组a[ ],b[ ],c[ ]对应位置都没有皇后来确定。 沈 阳 大 学 课程设计说明书 NO.3 3.2 递归算法 递归查找全部解的算法描述如下: void FindQueens(int i) { for(iColumn=0;iColumn8;iColumn++) { if(a[iColumn]==0b[i-iColumn+7]==0c[i+iColumn]==0)//如无冲突 Queen[i][iColumn]=#; //放皇后 a[iColumn]=1; //标记,下一次该列上不能放皇后 b[i-iColumn+7]=1; //标记,下一次该主对角线上不能放皇后 c[i+iColumn]=1; //标记,下一次该反对角线上不能放皇后 if(i7) FindQueens(i+1); //如果行还没有遍历完,进入下一行 else //否则输出 { //输出棋盘状态 for(iLine=0;iLine8;iLine++) for(iColumn=0;iColumn8;iColumn++) cout Queen[iLine][iColumn]; //如果前次的皇后放置导致后面的放置无论如何都不能满足要求,则回溯,重置 Queen[i][iColumn]=*; a[iColumn]=0; b[i-iColumn+7]=0; c[i+iColumn]=0;      } } } 沈 阳 大 学 课程设计说明书 NO.4 4 详细设计 4.1 主函数和初始化 //主函数,提供程序入口,并初始化棋盘为没有皇后的状态,以便放置皇后 int main() { int iLine,iColumn; cout============================================endl 本程序是八皇后问题演示程序,采用模拟友好界面,本程endl 序具有界面友好易操作等特点,但是未考虑放置状态旋 endl 转重复问题,总计92种状态  

文档评论(0)

1亿VIP精品文档

相关文档