user-0 提问: N后问题，求大神帮忙改改，现在是只能显示一种正确的情况，麻烦帮忙改成能显示所有正确放置方案

回复:
user: user-1
content: 只运行一次是没有递归 void n_queens(int n, int x[],int d=1){     if(d>n){         //print         return;     }     for(int i=0;i<n;i++) if(place(x,i)){         x[d] =i;         n_queens(n,x,d+1);     } }

user: user-2
content: 仅供参考：#include <stdio.h> int d[8][8]; int n; void queen8(int L) {     int x,y;      if (8==L) {         n++;         printf("%d\n",n);         for (y=0;y<8;y++) {             for (x=0;x<8;x++) { //              printf("%d",d[y][x]);                 if (d[y][x]) printf("■");                 else         printf("□");             }             printf("\n");         }         return;     }     for (x=0;x<8;x++) {         for (y=0;y<L;y++) {             if  (              d[y][x      ]              || (x-(L-y)>=0 && d[y][x-(L-y)])              || (x+(L-y)< 8 && d[y][x+(L-y)]))                 break;         }         if (y>=L) {             d[L][x]=1;             queen8(L+1);             d[L][x]=0;         }     } } int main() {     int y,x;     for (y=0;y<8;y++) {         for (x=0;x<8;x++) {             d[y][x]=0;         }     }     queen8(0);     return 0; }

user: user-0
content: 引用 2 楼 u011672336 的回复:第一：你的函数执行完第一次就打印了。 第二：递归是递归了，你却没有清空区间内的值，导致判断语句上完全就算你全部放好了。 第三：calloc没有free(),这是个很大的坏习惯。 另外附送我所能想到的最快八皇后 /* N皇后终结版 a[N]为已占用的行编号，b[N]为右斜对角编号，c[N]为左斜对角编号*/ #include "stdio.h" #define N 8 int a[N] = {1, 1, 1, 1, 1, 1, 1, 1} , b[2 * N - 1] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1} , c[2 * N - 1] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1} , mark[8]; int count = 0;  int cacl(int i){ 	int j; 	if (i == N){ 		print(); 		clear(i);                                             //输出后清除第八位 		return 0; 	} 	for (j = 0; j < N; j++){                                  //递归试放皇后，cheak成功后递归，否则继续执行for 		if(cheak(i, j)){ 			cacl(i+1);			 		} 	} 		if( j == N){                                          //若for结束，仍然没能进入下层递归，清除上一位 			clear(i); 			return 0;	 		}  	return 1; }   int write(int i, int j){ 	a[j] = 0; 	b[i + j] = 0; 	c[i - j + N - 1] = 0; 	mark[i] = j;                                              //mark数组记录j的位置 	return 0; }  int clear(int i){ 	a[mark[i - 1]] = 1; 	b[i - 1 + mark[i - 1]] = 1; 	c[i - 1 - mark[i - 1] + N - 1] = 1; }  int cheak(int i, int j){ 	int z; 	if (a[j] == 0 || b[i + j] == 0 || c[i - j + N - 1] == 0){		 		return 0; 	} 	else{ 		write(i, j); 		return 1;	 	}  }  int print(){ 	int i; 	printf("%d\n", ++count); 	for (i = 0; i < N; i++) 	{ 		printf("%d ", mark[i]); 	} 	printf("\n");  	 }  int Quess() { 	cacl(0); 	return 0; }  非常感谢您提出的三点，学习了

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:仅供参考：#include <stdio.h> int d[8][8]; int n; void queen8(int L) {     int x,y;      if (8==L) {         n++;         printf("%d\n",n);         for (y=0;y<8;y++) {             for (x=0;x<8;x++) { //              printf("%d",d[y][x]);                 if (d[y][x]) printf("■");                 else         printf("□");             }             printf("\n");         }         return;     }     for (x=0;x<8;x++) {         for (y=0;y<L;y++) {             if  (              d[y][x      ]              || (x-(L-y)>=0 && d[y][x-(L-y)])              || (x+(L-y)< 8 && d[y][x+(L-y)]))                 break;         }         if (y>=L) {             d[L][x]=1;             queen8(L+1);             d[L][x]=0;         }     } } int main() {     int y,x;     for (y=0;y<8;y++) {         for (x=0;x<8;x++) {             d[y][x]=0;         }     }     queen8(0);     return 0; }  能否麻烦您在我的代码上修改成能显示全部情况的N皇后呢

user: user-0
content: 引用 2 楼 u011672336 的回复:第一：你的函数执行完第一次就打印了。 第二：递归是递归了，你却没有清空区间内的值，导致判断语句上完全就算你全部放好了。 第三：calloc没有free(),这是个很大的坏习惯。 另外附送我所能想到的最快八皇后 /* N皇后终结版 a[N]为已占用的行编号，b[N]为右斜对角编号，c[N]为左斜对角编号*/ #include "stdio.h" #define N 8 int a[N] = {1, 1, 1, 1, 1, 1, 1, 1} , b[2 * N - 1] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1} , c[2 * N - 1] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1} , mark[8]; int count = 0;  int cacl(int i){ 	int j; 	if (i == N){ 		print(); 		clear(i);                                             //输出后清除第八位 		return 0; 	} 	for (j = 0; j < N; j++){                                  //递归试放皇后，cheak成功后递归，否则继续执行for 		if(cheak(i, j)){ 			cacl(i+1);			 		} 	} 		if( j == N){                                          //若for结束，仍然没能进入下层递归，清除上一位 			clear(i); 			return 0;	 		}  	return 1; }   int write(int i, int j){ 	a[j] = 0; 	b[i + j] = 0; 	c[i - j + N - 1] = 0; 	mark[i] = j;                                              //mark数组记录j的位置 	return 0; }  int clear(int i){ 	a[mark[i - 1]] = 1; 	b[i - 1 + mark[i - 1]] = 1; 	c[i - 1 - mark[i - 1] + N - 1] = 1; }  int cheak(int i, int j){ 	int z; 	if (a[j] == 0 || b[i + j] == 0 || c[i - j + N - 1] == 0){		 		return 0; 	} 	else{ 		write(i, j); 		return 1;	 	}  }  int print(){ 	int i; 	printf("%d\n", ++count); 	for (i = 0; i < N; i++) 	{ 		printf("%d ", mark[i]); 	} 	printf("\n");  	 }  int Quess() { 	cacl(0); 	return 0; }  能否麻烦您在我的代码上修改成能显示全部情况的N皇后呢

user: user-3
content: 第一：你的函数执行完第一次就打印了。 第二：递归是递归了，你却没有清空区间内的值，导致判断语句上完全就算你全部放好了。 第三：calloc没有free(),这是个很大的坏习惯。 另外附送我所能想到的最快八皇后 /* N皇后终结版 a[N]为已占用的行编号，b[N]为右斜对角编号，c[N]为左斜对角编号*/ #include "stdio.h" #define N 8 int a[N] = {1, 1, 1, 1, 1, 1, 1, 1} , b[2 * N - 1] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1} , c[2 * N - 1] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1} , mark[8]; int count = 0;  int cacl(int i){ 	int j; 	if (i == N){ 		print(); 		clear(i);                                             //输出后清除第八位 		return 0; 	} 	for (j = 0; j < N; j++){                                  //递归试放皇后，cheak成功后递归，否则继续执行for 		if(cheak(i, j)){ 			cacl(i+1);			 		} 	} 		if( j == N){                                          //若for结束，仍然没能进入下层递归，清除上一位 			clear(i); 			return 0;	 		}  	return 1; }   int write(int i, int j){ 	a[j] = 0; 	b[i + j] = 0; 	c[i - j + N - 1] = 0; 	mark[i] = j;                                              //mark数组记录j的位置 	return 0; }  int clear(int i){ 	a[mark[i - 1]] = 1; 	b[i - 1 + mark[i - 1]] = 1; 	c[i - 1 - mark[i - 1] + N - 1] = 1; }  int cheak(int i, int j){ 	int z; 	if (a[j] == 0 || b[i + j] == 0 || c[i - j + N - 1] == 0){		 		return 0; 	} 	else{ 		write(i, j); 		return 1;	 	}  }  int print(){ 	int i; 	printf("%d\n", ++count); 	for (i = 0; i < N; i++) 	{ 		printf("%d ", mark[i]); 	} 	printf("\n");  	 }  int Quess() { 	cacl(0); 	return 0; }