递归方法
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int q[100] = { 0 };
void Nqueen(int N, int K);
int num = 0;
int main()
{
int N;
scanf("%d", &N);
Nqueen(N, 0);
printf("%d", num);
}
void Nqueen(int N, int K)
{
int j;
if (K == N)
{
for (int i = 0; i < N; i++)
{
printf("%d ", q[i] + 1);
}
num++;
printf("\n");
}
else
{
for (int i = 0; i < N; i++)
{
q[K] = i;//第K行位于第i列
for (j = 0; j < K; j++)
{
if ((q[K]==q[j])||(abs(q[K]-q[j])==K-j))//与前K-1行不位于对角线上且不同列
{
break;
}
}
if (j == K)
{
Nqueen(N, K + 1);
}
}
}
}
非递归方法(只能解决N固定)
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int q[4];
int Judge(int K, int J);//第K行放第J列
void Nqueen();
int main()
{
Nqueen();
}
int Judge(int K,int J)//第K行放第J列
{
for (int i = 0; i < K; i++)
{
if (abs(K - i) == abs(J - q[i]) || q[i] == J)
{
return 0;
}
}
return 1;
}
void Nqueen()
{
int a, b, c, d;
{
for (a = 0; a < 4; a++)
{
q[0] = a;
for (b = 0; b < 4; b++)
{
if (Judge(1, b))
{
q[1] = b;
for (c = 0; c < 4; c++)
{
if (Judge(2, c))
{
q[2] = c;
for (d = 0; d < 4; d++)
{
if (Judge(3, d))
{
q[3] = d;
for (int i = 0; i < 4; i++)
{
printf("%d ", q[i]+1);
}
printf("\n");
}
}
}
}
}
}
}
}
}
递归可以用来解决多重循环