易截截图软件、单文件、免安装、纯绿色、仅160KB

递归 回溯法求解8皇后问题(C)

无意中翻出了N年前写的递归-回溯法求解8皇后问题,干粹塞到博客中吧。
#include <stdio.h>
#include <conio.h>
#include <math.h>
#define QUEENS 8
// 记录解的序号的全局变量。
int iCount = 0;
// 记录皇后在各列上的放置位置的全局数组。
int Site[QUEENS];
// 递归求解的函数。
void Queen(int n);
// 输出一个解。
void Output();
// 判断第n个皇后放上去之后,是否有冲突。
int IsValid(int n);
void main()
{
// 从第0列开始递归试探。
Queen(0);
}
//Queen:递归放置第n个皇后。
void Queen(int n)
{
int i;
// 参数n从0开始,等于8时便试出了一个解,将它输出并回溯。
if(n == QUEENS)
{
Output();
return;
}
// n还没到8,在第n列的各个行上依次试探。
for(i = 1 ; i <= QUEENS ; i++)
{
// 在该列的第i行上放置皇后。
Site[n] = i;
// 如果放置没有冲突,就开始下一列的试探。
if(IsValid(n))
Queen(n + 1);
}
}
// IsValid:判断第n个皇后放上去之后,是否合法,即是否无冲突。
int IsValid(int n)
{
int i;
// 将第n个皇后的位置依次于前面n-1个皇后的位置比较。
for(i = 0 ; i < n ; i++)
{
// 两个皇后在同一行上,返回0。
if(Site[i] == Site[n])
return 0;
// 两个皇后在同一对角线上,返回0。
if(abs(Site[i] - Site[n]) == (n - i))
return 0;
}
// 没有冲突,返回1。
return 1;
}
// Output:输出一个解,即一种没有冲突的放置方案。
void Output()
{
int i;
// 输出序号。
printf("No.%-5d" , ++iCount);
// 依次输出各个列上的皇后的位置,即所在的行数。
for(i = 0 ; i < QUEENS ; i++) {
printf("%d " , Site[i]);
}
printf("\n");
}

这一算法求出92种布局。但它们并非本质解,所以输出的布局当中,有一些经过旋转、镜像等变换后是等价的。
如果要求出本质解(应该只有12种),可以考虑将已经求出的布局放在一个链表中,然后每次得到一种新的布局时,都跟前面的依次比较一下,看看经过旋转、镜像后是否一致,如果一样则舍弃。


相关文档:

c输出标准总结

  C输出格式总结 收藏
C输出格式总结
 
1 一般格式
   printf(格式控制,输出表列)
   例如:printf("i=%d,ch=%c\n",i,ch);
   说明:
   (1)“格式控制”是用双撇号括起来的字符串,也称“转换控制字符串”,它包括两种信息:
 &nbs ......

C和C++的点滴积累(1)

                     C和C++的点滴积累(1)
1. mfc 编程中存在着如果出现“内存不足”的对话框,一种情况是在申请内存的时候出现问题,也就是例如:char *pChar = new char[num]; 但此时num 为零或者负 ......

symbian Open C and Open C++ 相关

nokia wiki:http://developer.symbian.org/wiki/index.php/Open_C_and_Open_C%2B%2B_Technical_Overview/zh-hans
symbian上开发openc时需要注意的问题
http://blog.csdn.net/sizhiguo/archive/2009/05/21/4206138.aspx
第一:如printf、sprint、文件操作、socket操作等,模拟器屏幕都会出现白屏等待,并且是一直下去。 ......

C Traps and Pitfalls 读书摘记

用单引号引起的一个字符实际上代表一个整数,整数值对应于改字符在编译器采用的字符集中的序列值。
用双引号引起的字符串,代表的是一个指向无名数组起始字符的指针,该数组被双引号之间的字符以及一个额外的二进制值为零的字符'\0'初始化。
printf("Hello world\n");

char hello[] = {'H', 'e', 'l', 'l', 'o', ' ' ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号