求数据结构课程设计“八皇后问题”C语言(有注解)
编写程序实现将八个皇后放置在国际象棋棋盘的无冲突的位置上的算法,并给出所有的解。提示:在国际象棋上放置皇后时,任何一个皇后的水平、竖直和斜45�0ÿ...
编写程序实现将八个皇后放置在国际象棋棋盘的无冲突的位置上的算法,并给出所有的解。
提示:在国际象棋上放置皇后时,任何一个皇后的水平、竖直和斜45�0�2都不能有另一个皇后。解决该问题采用逐次试探的方法,即采用递归调用putchess函数的方法。首先将第一个皇后放于第一行第一列,然后开始向下一行递归。每一步递归中,首先检测待放置位置是否与已放置的皇后冲突,如不冲突,则进行下一行的放置,否则,选择该行的下一个位置进行检测。如整行的位置都冲突,则回到上一行,重新选择位置。 展开
提示:在国际象棋上放置皇后时,任何一个皇后的水平、竖直和斜45�0�2都不能有另一个皇后。解决该问题采用逐次试探的方法,即采用递归调用putchess函数的方法。首先将第一个皇后放于第一行第一列,然后开始向下一行递归。每一步递归中,首先检测待放置位置是否与已放置的皇后冲突,如不冲突,则进行下一行的放置,否则,选择该行的下一个位置进行检测。如整行的位置都冲突,则回到上一行,重新选择位置。 展开
1个回答
2013-07-23
展开全部
{输入棋盘大小值n;m=0; //从空配置开始notcatch=1; //空配置中皇后不能相互捕捉do{if(notcatch){if(m==n){输出解;调整(形成下一个候选解else扩展当前候选解至下一列; //向前试探else调整(形成下一个候选解); //向后回溯notcatch = 检查当前候选解的合理性*/#include "stdlib.h"#define MAXN 100//全局变量及全局工作数组定义int m,n,NotCatch;int ColFlag[MAXN+1]; /*表示第i列的第ColFlag[i]行有皇后,(1:有;0:没有)*/int RowFlag[MAXN+1]; /*RowFlag[i]:表示第i行没有皇后(1:没有;0:有)*/int upBiasFlag[2*MAXN+1]; /*upBiasFlag[i]:表示第i条上斜线(右高左斜)没有皇后(1:没有;0:有)*/int dnBiasFlag[2*MAXN+1]; /*dnBiasFlag[i]:表示第i条下斜线(左高右斜)没有皇后(1:没有;0:有)*///显示输入填写的数字void ArrangeQueen(){int i;char answer;printf("输入棋盘边格数:");scanf("%d",&n);for(i=0;i<=n;i++) /*设置程序初始状态*/ColFlag[i] = 1;for(i=0;i<=2*n;i++)upBiasFlag[i] = dnBiasFlag[i] = 1;m = 1;ColFlag[1] = 1;NotCatch = 1;ColFlag[0] = 0;do{if(NotCatch){if(m==n){printf("列 行");for(i=1;i<=n;i++) /*找到可行解,输出*/printf("%3d %3d ",i,ColFlag[i]);printf("还要继续搜索吗(Q/q for Exit)? ");scanf("%c",&answer);if(answer=='Q' || answer=='q')exit(0);while(ColFlag[m] == n){m--; /*清除第m-1列,第RowFlag[ColFlag[m-1]]行有皇后的标志ColFlag[m]++; /*调整第m列的皇后配置(扩展调整else{/*设置第m列,第RowFlag[ColFlag[m-1]]行有皇后的标志*/RowFlag[ColFlag[m]] = upBiasFlag[m+ColFlag[m]] = dnBiasFlag[n+m-ColFlag[m]] = 0;ColFlag[++m] = 1; /*向前试探else{while(ColFlag[m]==n) /*向后回溯*/{m--; /*清除第m-1列,第RowFlag[ColFlag[m-1]]行有皇后的标志ColFlag[m]++; /*调整第m列的皇后配置(回溯调整void dArrange_Queen_All(int k,int n){int i,j;char answer;for(i=1;i<=n;i++){if(RowFlag[i] && upBiasFlag[k+i] && dnBiasFlag[n+k-i]){ColFlag[k] = i;RowFlag[i] = upBiasFlag[k+i] = dnBiasFlag[n+k-i] = 0;if(k==0){printf("列 行");for(j=1;j<=n;j++) /*找到可行解,输出*/printf("%3d %3d ",i,ColFlag[i]);printf("还要继续搜索吗(Q/q for Exit)?void dArrangeQueenAll(){int i;printf("输入棋盘边格数:");scanf("%d",&n);for(i=0;i<=n;i++) /*设置程序初始状态</p>
光点科技
2023-08-15 广告
2023-08-15 广告
通常情况下,我们会按照结构模型把系统产生的数据分为三种类型:结构化数据、半结构化数据和非结构化数据。结构化数据,即行数据,是存储在数据库里,可以用二维表结构来逻辑表达实现的数据。最常见的就是数字数据和文本数据,它们可以某种标准格式存在于文件...
点击进入详情页
本回答由光点科技提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询