利用回溯法解决八皇后问题(循环)
2.用循环解决
#include <stdio.h>
#include <stdlib.h>
int a[20],n,sum;
void output()//输出
{
int i,j;
for(i = 1; i<=n; i++)
{
for(j = 1; j<=n; j++)
{
if(a[i]==j)
printf(" Q");
else
printf(" *");
}
printf("\n");
}
printf("\n");
}
int check(int k)//检查当前位置是否可放
{
int i;
for(i = 1; i<=k-1; i++)
//abs(a[i] - a[k])==abs(i - k))用于判断当前位置是否在前面任一皇后的左下斜线或右下斜线方向
//(a[i]==a[k])用于判断当前位置是否在前面任一皇后的正下方
if( (abs(a[i] - a[k])==abs(i - k)) || (a[i]==a[k]) )
return 0;//不可以放
return 1;//可以放
}
void backdate(int n)
{
int k;
a[1] = 0;
k = 1;
while(k>0)
{
a[k] = a[k] + 1;
while((a[k]<=n) && (check(k)==0) ) //为第k个皇后搜索位置
a[k] ++;//如果不可放,则皇后往右放一个位置,直到可放或者 位置>n,跳出循环
if(a[k]<=n)//如果可放
if(k==n) //找到n个皇后的一种放置方法
{
output();
sum ++;
}
else
{
k ++; //第k个皇后找到位置,继续为第k+1个皇后找位置
a[k] = 0; //注意下一个皇后一定要从头开始搜索
}
else//否则回到上一个皇后的摆放情况
k --; //回溯
}
}
int main()
{
int i;
scanf("%d",&n);
sum = 0;
for(i = 0; i < 20; i++)
a[i] = 0;
backdate(n);
printf("共有%d种方案\n",sum);
return 0;
}
注:
也可把void backdate(int n)函数里面的while分离,取消backdate函数,稍作改变也可改为递归的形式求解。
来源:CSDN
作者:VGtime
链接:https://blog.csdn.net/JKR10000/article/details/104847553