|
发表于 2020-3-30 16:15:01
|
显示全部楼层
/* 此程序以“穷举法”来解八皇后问题 文件名BHH.C TC2.0调试通过 */
/* 设一8*8棋盘如下图: */
/* 1 2 3 4 5 6 7 8 */
/* 1:0 0 0 0 0 0 0 * */
/* 2:0 * 0 0 0 0 0 0 */
/* 3:0 0 0 * 0 0 0 0 */
/* 4:* 0 0 0 0 0 0 0 */
/* 5:0 0 0 0 0 0 * 0 */
/* 6:0 0 0 0 * 0 0 0 */
/* 7:0 0 * 0 0 0 0 0 */
/* 8:0 0 0 0 0 * 0 0 */
/* 可用一8位序列表示8个皇后的位置,如“82417536”,其意为顺序地列出各行中皇后所在列的序号 */
/* 则问题转换为以下两点: */
/* 1.生成8位序列P,并使序列中各位数字均不重复,即保证不同列(不同行在定义序列时已能避免). */
/* 2.在满足(1)的序列中找出一个序列,使序列中任意两位上数字之差的绝对值不等于他们的序号 */
/* 之差的绝对值,即在棋盘同一对角线上不存在两个皇后. */
/* 所有满足(2)的序列即为八皇后问题的解. */
#include<stdio.h>
#include<math.h>
#define N 8 /* 通过调整N的值可定义棋盘的大小 */
void check(int p[]) /* 函数check用来检测序列P是否满足(2) */
{int i, j;
for (i=0; i<N-1; i++)
for (j=i+1; j<N; j++)
if (abs(p[j]-p[i])==j-i) return; /* 不满足则返回到函数permute继续找下一个P */
for (printf(" "), i=0; i<N; printf ("%d",p[i++]) ); /* 满足(2)的序列打印结果 */
}
/* 函数permute用递归法来找出满足(1)的序列P */
void permute(int n, int p[]) /* n表示当前已找到第几行(设从第8行向上找),用P[]来保存序列 */
{int i, j;
if (n==1) check(p);
for (i=0, j=n-1; i<N; i++) /* 找出下一行可放皇后的列(已放过的列i所对应的P[i]!=0) */
if (!p[i]) {p[i]=j; permute(j,p); p[i]=0;}
}
main()
{int p[N]={0}, n=N; /* 定义数组p[N]用来存放结果序列,n为行号 */
printf("\n");
permute(n+1,p); /* 调用permute函数进行搜索 */
} |
|