代码来源:https://www.cnblogs.com/houkai/p/3480940.html
参考代码:(注解多为自己填写)
#include <iostream>
#include <stdlib.h>
using namespace std;
//k为第几行,a[k]为第几列
bool check_2 (int a[],int n)
{
for(int i=1;i<=n-1;i++)//依次判断n行之前的皇后是否与n行皇后冲突
{
if((abs(a[i]-a[n])==n-i)||(a[i]==a[n]))//对角线不相等且不在同一列
return false;
}
return true;
}
int a[100], n, count;
void backtrack(int k)
{
if (k>n)//当k=n+1时找到解
{
for(int i=1;i<=8;i++)
{
//cout<<a[i];
}
//cout<<endl;
count++;
}
else
{
for (int i = 1;i <=n; i++)//找不到合适的列(位置),回到上一行
{
a[k] = i; //依次寻找适合的列
if (check_2(a,k) == 1)//当前皇后的位置符合要求,则求下一个皇后
{backtrack(k+1);} //递归调用,进入下一行(即下一个皇后)
}
}
}
int main()
{
n=8,count=0;
backtrack(1);//从第一行开始
cout<<count<<endl;
}
某道程序填空题修改后结果:
//求解N 皇后问题
#include <stdio.h>
#include <stdlib.h>
#define N 20 //最多皇后个数
int q[N]; //存放各皇后所在的列号,即(i,q[i])为一个皇后位置
int count = 0; //累计解个数
void dispasolution(int n) //输出n 皇后问题的一个解
{
printf(" 第%d 个解:", ++count);
for(int i = 1; i <= n; i++)
printf("(%d,%d) ", i, q[i]);
printf("\n");
}
//i代表行,j代表列
bool place(int i, int j) //测试(i,j)位置能否摆放皇后
{
int k=1;
if(i == 1)
return true; //第一个皇后总是可以放置int k = 1;
while( k<=i-1 ) {//1 //k=1~i-1 是已放置了皇后的行
if((q[k] == j ) || (abs(q[k] - j))== i-k )//2 3
return false;
k++;
}
return true;
}
void queen(int i, int n) //放置 1~i 的皇后
{
if( i>n )//4
dispasolution(n); //所有皇后放置结束
else {
for(int j = 1; j <= n; j++) //在第i 行上试探每一个列j
if(place(i, j)) {
//在第i 行上找到一个合适位置(i,j)
q[i]=j ;//5
queen(i+1, n) ;//6
}
}
}
int main()
{
int n; //n 为存放实际皇后个数
printf(" 皇后问题(n<20) n=");
scanf("%d", &n);
if(n > 20)
printf("n 值太大,不能求解\n");
else {
printf("%d 皇后问题求解如下:\n", n);
queen(1, n); //放置 1~i 的皇后
}
}
自己参考后用c写的,但有错误,暂时还不知道为什么错
#include <stdio.h>
#include <stdlib.h>
int i,n,count,a[100];
int check(int a[],int n)
{
for(i=1;i<=n-1;i++)
{
if((abs(a[n]-a[i])==n-i)||(a[n]==a[i]))
return 0;
}
return 1;
}
void recursion(int k)
{
if(k>n)
{
printf("111\n");
count++;
}
else
{
for(i=1;i<=n;i++)
{
a[k]=i;
if(check(a,k)==1)
{ recursion(k+1);
printf("111\n");
}
}
}
}
int main()
{
n=8;
count=0;
printf("%d",count);
recursion(1);
printf("%d",count);
}