求数据结构课程设计“八皇后问题”C语言(有注解)
编写程序实现将八个皇后放置在国际象棋棋盘的无冲突的位置上的算法,并给出所有的解。
提示:在国际象棋上放置皇后时,任何一个皇后的水平、竖直和斜45º都不能有另一个皇后。解决该问题采用逐次试探的方法,即采用递归调用putchess函数的方法。首先将第一个皇后放于第一行第一列,然后开始向下一行递归。每一步递归中,首先检测待放置位置是否与已放置的皇后冲突,如不冲突,则进行下一行的放置,否则,选择该行的下一个位置进行检测。如整行的位置都冲突,则回到上一行,重新选择位置。
答案:有疑问问。
#include "stdio.h"#include "windows.h"#define N 8 /* 定义棋盘大小 */int place(int k); /* 确定某一位置皇后放置与否,放置则返回1,反之返回0 */void backtrack(int i);/* 主递归函数,搜索解空间中第i层子树 */void chessboard(); /* 每找到一个解,打印当前棋盘状态 */static int sum, /* 当前已找到解的个数 */x[N]; /* 记录皇后的位置,x[i]表示皇后i放在棋盘的第i行的第x[i]列 */int main(void){backtrack(0);system("pause");return 0;}int place(int k){/* 测试皇后k在第k行第x[k]列时是否与前面已放置好的皇后相攻击。 x[j] == x[k] 时,两皇后在同一列上;abs(k - j) == abs(x[j] - x[k]) 时,两皇 后在同一斜线上。两种情况两皇后都可相互攻击,故返回0表示不符合条件。*/for (int j = 0; j < k; j ++)if (abs(k - j) == abs(x[j] - x[k]) || (x[j] == x[k])) return 0;return 1;}void backtrack(int t){/* t == N 时,算法搜索至叶结点,得到一个新的N皇后互不攻击的放置方案 */if (t == N) chessboard();elsefor (int i = 0; i < N; i ++) {x[t] = i;if (place(t)) backtrack(t + 1);}}void chessboard(){printf("第%d种解法:\n", ++ sum);for (int i = 0; i < N; i ++) {for (int j = 0; j < N; j ++)if (j == x[i]) printf("@ ");else printf("* ");printf("\n");}printf("\n");}{输入棋盘大小值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++) /*设置程序初始状态
上一个:C语言 停车场管理 急急急!!~~~明天7点之前就要
下一个:教材 计算机程序设计基础(C语言)P47 上的例题,求详解。。。