/*
八皇后问题
在8*8的棋盘上摆放8个皇后,不能处于一排一列或者一斜线上,,使其不能相互攻击
*/
#include <stdio.h>
#include <math.h> //使用绝对值函数asb
const int N = 100; //最多求100皇后问题
int x[N] = {-1}; //数组初始化为-1
int Place(int k);
void PrintQueue(int n);
void Queue(int n)
{
int k = 0,num = 0;
while(k>=0) //摆放皇后k,
{
x[k]++; //在下一列摆放皇后k
while(x[k] < n && Place(k) == 1) //发生冲突
x[k]++; //皇后k试探下一列
if(x[k] < n && k==n-1)
{
printf("第%d个解是:",++num);
PrintQueue(n);
}else if(x[k] <n && k<n-1) //尚有皇后未摆放
k = k+1; //准备摆放下一个皇后
else
x[k--] = -1; //重置x[k],回溯,重新摆放皇后k
}
}
int Place(int k) //观察皇后k放置在x[k]列是否发生冲突
{
for(int i=0;i<k;i++)
if(x[i] == x[k] || abs(i+k) == abs(x[i] - x[k]))
return 1;
return 0;
}
void PrintQueue(int n)
{
for(int i=0;i<n;i++)
printf("%5d",x[i]+1); //数组下标从0开始,打印的列号从1开始
printf("\n");
}
int main()
{
int n;
printf("请输入皇后个数(n>=4)");
scanf("%d",&n);
Queue(n);
return 0;
八皇后问题
在8*8的棋盘上摆放8个皇后,不能处于一排一列或者一斜线上,,使其不能相互攻击
*/
#include <stdio.h>
#include <math.h> //使用绝对值函数asb
const int N = 100; //最多求100皇后问题
int x[N] = {-1}; //数组初始化为-1
int Place(int k);
void PrintQueue(int n);
void Queue(int n)
{
int k = 0,num = 0;
while(k>=0) //摆放皇后k,
{
x[k]++; //在下一列摆放皇后k
while(x[k] < n && Place(k) == 1) //发生冲突
x[k]++; //皇后k试探下一列
if(x[k] < n && k==n-1)
{
printf("第%d个解是:",++num);
PrintQueue(n);
}else if(x[k] <n && k<n-1) //尚有皇后未摆放
k = k+1; //准备摆放下一个皇后
else
x[k--] = -1; //重置x[k],回溯,重新摆放皇后k
}
}
int Place(int k) //观察皇后k放置在x[k]列是否发生冲突
{
for(int i=0;i<k;i++)
if(x[i] == x[k] || abs(i+k) == abs(x[i] - x[k]))
return 1;
return 0;
}
void PrintQueue(int n)
{
for(int i=0;i<n;i++)
printf("%5d",x[i]+1); //数组下标从0开始,打印的列号从1开始
printf("\n");
}
int main()
{
int n;
printf("请输入皇后个数(n>=4)");
scanf("%d",&n);
Queue(n);
return 0;
}