p; //输出解的个数
}
int place(int i, int k, int *p)
{
int m;
for (m=0; m<k; m++)
{
if ((p[m]==i)||(abs(m-k)==abs(p[m]-i))) //k+1行i列不是合法位置
return (0);
}
return (1); //k+1行i列是合法位置
}
int find(int n, int *p, int k)
{
int i;
i=p[k];
for (i++; i<=n; i++)
{
if (place(i, k, p)==1) //在k+1行找到可放置皇后的列
return (i); //返回该列
}
return (0); //在k+1行没有找到可放置皇后的列
}
void output(int n, int *p)
{
int i, j;
for (i=0; i<n; i++)
{
for (j=1; j<=n; j++)
{
if (j==p[i])
printf("1 ");
else
printf("0 ");
}
printf("\n");
}
printf("\n");
}
附n皇后问题的递归代码:
该程序段为自己的创作(教科书上现成的代码没必要复制粘贴),意义不是很大,因为比较繁琐,当n<=8时能输出正确结果,n>8时直接STACKOVERFLOW,所以大家看看就好,并不实用
#include <stdio.h>
#include <math.h>
#include <malloc.h>
#include <stdlib.h>
void print(int n);
void put(int k, int n, int *q, int *p);
void output(int n, int *p);
int law(int k ,int i, int *p);
void main ()
{
int n;
printf ("you want to solve the problem of n queens the n=?\n");
scanf ("%d", &n);
print(n);
}
void print(int n)
{
int number, i;
int *p;
number=0;
p=(int *)malloc(n*sizeof(int));
for (i=0; i<n; i++)
*(p+i)=0;
put(1, n, &number, p);
printf("There are %d solutions in total\n", number);
free(p);
}
void put(int k, int n, int *q, int *p)
{
int i;
if (k==1)
{
(*p)++;
if ((*p)>n)
return;
put(k+1, n, q, p);
}
else
{
i=*(p+k-1);
i++;
while (i<=n)
{
if (law(k, i, p))
{
*(p+k-1)=i;
if (k==n)
{
(*q)++;
printf ("The %dnd solution\n", *q);
output(n, p);
put(k, n, q, p);
}
else
{
&nb