八皇后问题求解
八皇后问题是编程人员需要解决的重要得问题
它可以用递归来解决,但是递归的效率并不太高,也可以用数据结构来解决,因为只需要记录有还是没有,所以说用二维数组就OK,数据结构不用太复杂。
另外可以这样想,既然结果只是记录有还是没有,所以说不用二维数组,把数组改为一维数组,只用记录是在哪一行,哪一列就OK。
如int a[8];
a[i]=3表示第i行的位置是在3
所以说这样用一维数组就可以表示出位置。
代码如下
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define INTABLE -1
void Init(int* a ,int n) //初始化
{
int i;
for (i = 0; i < n; i++)
{
a[i] = INTABLE;
}
}
int IsValid(int* a, int row, int col) //判断第row行,第col列是否可以放皇后,行和列从0开始
{
int i = 0;
for (i = 0; i < row-1;i++)
{
if (a[i] == col || abs(i - row) == abs(a[i] - col)) //如果列冲突或者对角线冲突
{
return 0;
}
}
return 1;
}
void print(int* a,int n) //打印出正确的解
{
int i;
for (i = 0; i < n; i++)
{
printf("%d,%d\n", i, a[i]);
}
}
void queue() //队列
{
int a[8];
Init(a,8);
int i = 0;
int j = 0;
int m = 1;
while (i < 8)
{
while (j < 8)
{
if (IsValid(a, i, j))
{
a[i] = j;
j = 0;
break;
}
else
{
j++;
}
}
if (a[i] == INTABLE) //如果说这一行没有合适的位置
{
if (i == 0) //回到第一行仍然没有合适的位置,则说明所有的已经遍历,退出该函数
{
break;
}
i--;
j = a[i] + 1;
a[i] = INTABLE;
continue;
}
if (i == 7) //说明已经遍历到最后一行,找到了一个合适的解,打印出来
{
printf("%d", m);
print(a, 8); //打印出正确的解
j = a[i] + 1;
a[i] = INTABLE;
m++;
continue;
}
i++;
}
}
int main()
{
queue(); //输出所有数组
getchar();
}
//未完待续,回头再写