@源代码
#include<stdio.h>
#define true 1
#define false 0
void print(int[]);//打印所有的解
void move(int, int,int [],int [],int []);//移除
void eightqueen1();
void eightqueen2();
int num = 0;//统计八皇后的所以解的数量
void main()
{
eightqueen2();
}
void eightqueen1()//一组八皇后
{
int s[9], i, j;//s数组下标i表示行,s[i]=j表示列。
int a[9]; //判断i列上是否有皇后存在
int b[17], c[17]; //判断当前位置 / \两个对角线方向是否有皇后存在。
for ( i = 2; i <= 16; i++)//赋值,得到一个空的8 x 8棋盘。
{
if (i >= 2 && i <= 9)
{
a[i-1] = true;//真为没有皇后存在
}
b[i] = true; c[i] = true;
}
i = 1; j = 1;//初始化第一个位置。
while (i<=8)
{
while (j<=8)
{
if (a[j] && b[i + j] && c[i - j + 9])//i+j表示对角线/,i-j表示对角线\,+9的原因控制下标值在2-16之间,方便计算。
{
break;
}
else
{
j++;//该位置3个方向中存在皇后,列数+1,继续搜索。
}
}
if (j <= 8)
{
a[j] = false, b[i + j] = false, c[i - j + 9] = false;
s[i] = j;//皇后入栈
i++; j = 1;//改行已经放置一个皇后,所以指向下一行,列数重新初始化为每行的第一个单元格。
}
else
{
i--; j = s[i];//回溯到上一行的放置皇后的位置
a[j] = true; b[i + j] = true; c[i - j + 9] = true;
j++;//因为上一行放置的皇后导致下一行没有符合条件的位置,改变上一行的位置,向右移动一步。
}
}
for (i = 1; i <= 8; i++)
{
printf_s("(%d , %d ) ",i,s[i]);
}
}
void eightqueen2()//所有八皇后的解
{
int s[9], i, j;//s数组下标i表示行,s[i]=j表示列。
int a[9]; //判断i列上是否有皇后存在
int b[17], c[17]; //判断当前位置 / \两个对角线方向是否有皇后存在。
for (i = 2; i <= 16; i++)//赋值,得到一个空的8 x 8棋盘。
{
if (i >= 2 && i <= 9)
{
a[i - 1] = true;//真为没有皇后存在
}
b[i] = true; c[i] = true;
}
i = 1; j = 1;//初始化第一个位置。
while (i >= 1)//输出一个解后,需要退栈,当退到第一个栈(i=1),结束。
{
while (j <= 8)
{
if (a[j] && b[i + j] && c[i - j + 9])//i+j表示对角线/,i-j表示对角线\,+9的原因控制下标值在2-16之间,方便计算。
{
break;
}
else
{
j++;//该位置3个方向中存在皇后,列数+1,继续搜索。
}
}
if (j <= 8)
{
a[j] = false, b[i + j] = false, c[i - j + 9] = false;
s[i] = j;//皇后入栈
if (i == 8)
{
num++;
print(s);//打印出第一个解
move(i, j,a,b,c);//删除该位置的皇后,寻找不同的解。
i--; j = s[i];//回到上一行皇后所在的位置。
move(i, j, a, b, c);//继续删除该位置的皇后
j++;//删除后更换位置,以便下面行的皇后位置有所不同。
}
else
{
i++; j = 1;//改行已经放置一个皇后,所以指向下一行,列数重新初始化为每行的第一个单元格。
}
}
else
{
i--;
if (i >= 1)
{
j = s[i];//回溯到上一行的放置皇后的位置
move(i, j, a, b, c);
}
j++;//因为上一行放置的皇后导致下一行没有符合条件的位置,改变上一行的位置,向右移动一步。
}
}
}
void print(int s[])
{
printf_s("%2d ", num);
for (int i = 1; i <= 8; i++)
{
printf_s("(%d , %d ) ", i, s[i]);
if (i == 8)
{
printf_s("\n");
}
}
}
void move(int i,int j,int a[],int b[],int c[])
{
a[j] = true, b[i + j] = true, c[i - j + 9] = true;
}