递归 回溯法求解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种),可以考虑将已经求出的布局放在一个链表中,然后每次得到一种新的布局时,都跟前面的依次比较一下,看看经过旋转、镜像后是否一致,如果一样则舍弃。
相关文档:
当尝试从文件读入字符时,getc()函数会返回EOF,所以程序会在下一次读取时才会发现文件结尾。此时程序在试图读取空文件,可能会发生一些问题。所以应当在循环入口处进行判断。
int ch;
FILE * fp;
fp = fopen ("test","r");
while ((ch = getc(fp) != EOF)
{
putchar (ch);
} ......
操作函数,所在函数库为string.h、mem.h
mem…操作存贮数组
void *memccpy(void *destin,void *source,unsigned char ch,unsigned n)
void *memchr(void *s,char ch,unsigned n)
void *memcmp(void *s1,void *s2,unsigned n)
int memicmp(void *s1,void *s2,unsigned n)
void *memmove(void *destin ......
引言
最近笔者一直在做JPEG的解码工作,发现用完全使用哈夫曼树进行解码比较费时,而使用表结构存储编码和值的对应关系比较快捷,但是也存在比较难处理的地方,比如解码工作通常是以位为单位的操作,这里必然会涉及到移位操作,而笔者之前对位的操作很少,经验很欠缺,经过这次历练终于发现了一个自己曾经忽视的东西,那就 ......
通信
Server:
#pragma comment(lib, "ws2_32.lib")
#include <Winsock2.h>
#include <stdio.h>
void main()
{
//版本协商
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(1,1); //0x0101
err = WSAStartup ......
1. linux下启动oracle
su - oracle
sqlplus /nolog
conn /as sysdba
startup
exit
lsnrctl start
exit
2. linux下关闭oracle
su - oracle
sqlplus /nolog
conn /as sysdba
shutdown immediate
exit
lsnrctl stop
exit
3、启动监听器
oracle@suse92:~> lsnrctl start
4、停止监听器
oracle@suse92:~ ......