#include "windows.h"
#define N 8 /* 定义棋盘大小 */
int place(int k)/* 确定某一位置皇后放置与否,放置则返回1,反之返回0 */
void backtrack(int i)/* 主递归函数,搜索解空间中第i层子树 */
void chessboard()/* 每找到一个解,打印当前棋盘状态 */
static int sum, /* 当前已找到解的个数 */
x[N]/* 记录皇后的位置,x[i]表示皇后i放在棋盘的第i行的第x[i]列 */
int main(void)
{
backtrack(0)
system("pause")
return 0
}
int place(int k)
{
/* 测试皇后k在第k行第x[k]列时是否与前面已放置好的皇后相攻击。 x[j] == */
/* x[k] 时,两皇后在同一列上;abs(k - j) == abs(x[j] - x[k]) 时,两皇 */
/* 后在同一斜线上。两种情况两皇后都可相互攻击,故返回0表示不符合条件。*/
for (int j = 0j <kj ++)
if (abs(k - j) == abs(x[j] - x[k]) || (x[j] == x[k])) return 0
return 1
}
void backtrack(int t)
{
/* t == N 时,算法搜索至叶结点,得到一个新的N皇后互不攻击的放置方案 */
if (t == N) chessboard()
else
for (int i = 0i <Ni ++) {
x[t] = i
if (place(t)) backtrack(t + 1)
}
}
void chessboard()
{
printf("第%d种解法:\n", ++ sum)
for (int i = 0i <Ni ++) {
for (int j = 0j <Nj ++)
if (j == x[i]) printf("@ ")
else printf("* ")
printf("\n")
}
printf("\n")
}
这是经典题目,答案网上有的是,抄一个学学就可以了:回溯法进行求解,程序实现如下:
#include<stdio.h>
#define Queens 8 //定义结果数组的大小,也就是皇后的数目
int a[Queens+1] //八皇后问题的皇后所在的行列位置,从1开始算起,所以加1
int main(){
int i, k, flag, not_finish=1, count=0
//正在处理的元素下标,表示前i-1个元素已符合要求,正在处理第i个元素
i=1
a[1]=1 //为数组的第一个元素赋初值
printf("The possible configuration of 8 queens are:\n")
while(not_finish){ //not_finish=l:处理尚未结束
while(not_finish &&i<=Queens){ //处理尚未结束且还没处理到第Queens个元素
for(flag=1,k=1flag &&k<ik++) //判断是否有多个皇后在同一行
if(a[k]==a[i])
flag=0
for (k=1flag&&k<ik++) //判断是否有多个皇后在同一对角线
if( (a[i]==a[k]-(k-i)) || (a[i]==a[k]+(k-i)) )
flag=0
if(!flag){ //若存在矛盾不满足要求,需要重新设置第i个元素
if(a[i]==a[i-1]){ //若a[i]的值已经经过一圈追上a[i-1]的值
i-- //退回一步,重新试探处理前一个元素
if(i>1 &&a[i]==Queens)
a[i]=1 //当a[i]为Queens时将a[i]的值置1
else
if(i==1 &&a[i]==Queens)
not_finish=0 //当第一位的值达到Queens时结束
else
a[i]++ //将a[il的值取下一个值
}else if(a[i] == Queens)
a[i]=1
else
a[i]++ //将a[i]的值取下一个值
}else if(++i<=Queens)
if(a[i-1] == Queens )
a[i]=1 //若前一个元素的值为Queens则a[i]=l
else
a[i] = a[i-1]+1 //否则元素的值为前一个元素的下一个值
}
if(not_finish){
++count
printf((count-1)%3 ? "\t[%2d]:" : "\n[%2d]:", count)
for(k=1k<=Queensk++) //输出结果
printf(" %d", a[k])
if(a[Queens-1]<Queens )
a[Queens-1]++ //修改倒数第二位的值
else
a[Queens-1]=1
i=Queens -1 //开始寻找下一个满足条件的解
}
}