关于八皇后问题的C++课程设计.docVIP

  • 130
  • 0
  • 约 10页
  • 2016-03-29 发布于重庆
  • 举报
关于八皇后问题的C课程设计

课 程 设 计 报 告 学院、系: 专业名称: 课程设计科目 VC++程序课程设计 学生姓名: 指导教师: 完成时间: 八皇后问题 一、设计任务与目标 用c++语言平台将的92种结构予以实现的主要思路以及思想:1. 解决冲突问题: 这个问题包括了行,列,两条对角线; 列:规定每一列放一个皇后,不会造成列上的冲突; 行:当第I行被某个皇后占领后,则同一行上的所有空格都不能再放皇后,要把以I为下标的标记置为被占领状态; 对角线:对角线有两个方向。在这把这两条对角线称为:主对角线和从对角线。在同一对角线上的所有点(设下标为(i,j)),要么(i+j)是常数,要么(i-j)是常数。因此,当第I个皇后占领了第J列后,要同时把以(i+j)、(i-j)为下标的标记置为被占领状态。 2数据结构的实现 数组a[I]:a [I]表示第I个皇后放置的列;I的范围:1..8; 对角线数组:b[j](主对角线),c[j](从对角线),根据程序的运行,去决定主从对角线是否放入皇后; A、 数据初始化。 B、 从n列开始摆放第n个皇后(因为这样便可以符合每一竖列一个皇后的要求),先测试当前位置(n,m)是否等于0(未被占领)。如果是,摆放第n个皇后,并宣布占领(记得横列竖列斜列一起设置),接着进行递归;如果不是,测试下一个位置(n,m+1),但是如果当n=8,m=8时,发现此时已无法摆放时,便要进行回溯。从问题的某一种可能出发,搜索从这种情况能出发,继续搜索,这种不断“回溯”的寻找解的方法,称为“回溯法”。、当n8时,便打印出结果。 全部源程序清单 #include conio.h #include math.h #include stdlib.h #include stdio.h #include iostream.h #define QUEENS 8 int iCount = 0; //!记录解的序号的全局变量。 int Site[QUEENS]; //!记录皇后在各行上的放置位置的全局数组。 void Queen(int n); //!递归求解的函数。 void Output();//!输出一个解。 int IsValid(int n); //!判断第n个皇后放上去之后,是否有〉冲突。 void main() /*----------------------------Main:主函数。----------------------------*/ { system(title 递归算法八皇后问题 ); cout 八皇后的解法:endl; cout -------------------------------------endl; Queen(0); //!从第0行开始递归试探。 getch();//!按任意键返回。 } void Queen(int n) /*-----------------Queen:递归放置第n个皇后,程序的核心!----------------*/ { int i; if(n == QUEENS) //!参数n从0开始,等于8时便试出了一个解,将它输出并回溯。 { Output(); return; } for(i = 1 ; i = QUEENS ; i++) //!n还没到8,在第n行的各个行上依次试探。 { Site[n] = i; //!在该行的第i行上放置皇后。 if(IsValid(n)) //!如果放置没有冲突,就开始下一行的试探。 Queen(n + 1); }} int IsValid(int n) /*------IsValid:判断第n个皇后放上去之后,是否合法,即是否无冲突。------*/ { int i; for(i = 0 ; i n ; i++) //!将第n个皇后的位置依次于前面n-1个皇后的位置比较。 { if(Site[i] == Site[n]) //!两个皇后在同一列上,返回0。 return 0; if(abs(Site[i] - Site[n]) == (n - i)) //!两个皇后在同一对角线上,返回0。 return 0; } return 1; //!没有冲突,返回1。 } void Output()/*------------Output:输出一个解,即一种没有冲突的放置方案。-

文档评论(0)

1亿VIP精品文档

相关文档