八皇后问题是典型的在解空间中深度优先递归搜索,遍历解空间树,寻找问题的所有解的问题。是回溯法(深度优先搜索)算法的典型例子。
深度优先搜索算法(DFS)的算法框架:
Proc
If (当前节点是目标结点)
Then { output() }
Else
{
for(对于所有可能的新结点)
search(新结点);
}
八皇后问题描述:
//8皇后程序输出92种结果
//这里我将上题修改成了n皇后,即按输出的n值,输出n皇后的所有摆放结果
#include<stdio.h>
#include<math.h>
int Queen[100]; //记录皇后的位置Queen[i] = j;表示第i行的皇后的在第j列
int sum = 0; //记录当前是第几个解
int n; //n皇后
void backtrack(int m); //递归函数
void output(); //每得到一个解,按格式输出结果
int canplace(int m); //判断当前第m行的皇后是否与前边已经放置的皇后冲突
int main()
{
scanf("%d",&n);
backtrack(0);
return (0);
}
void backtrack(int m)
{
if(m == n)
{
sum++;
output();
}
else
{
int i;
for(i = 0;i < n;i++)
{
Queen[m] = i;
if( canplace(m) )
backtrack(m + 1);
}
}
}
int canplace(int m)
{
int i;
for(i = 0;i < m;i++)
if((abs(m - i) == abs(Queen[m] - Queen[i])) || Queen[m] == Queen[i])
return (0);
return (1);
}
void output()
{
int i,j;
printf("NO %d\n",sum);
for(i = 0;i < n;i++)
{
for(j = 0;j < n;j++)
{
if(Queen[i] == j)
printf("# ");
else
printf("* ");
}
printf("\n");
}
}