user-0 提问: C语言解决八皇后问题

回复:
user: user-1
content: lz， N皇后问题是有公式的 ：  当n mod 6 != 2 且 n mod 6 != 3时，有一个解为： 2,4,6,8,...,n,1,3,5,7,...,n-1       (n为偶数) 2,4,6,8,...,n-1,1,3,5,7,...,n       (n为奇数)   (上面序列第i个数为ai，表示在第i行ai列放一个皇后；... 省略的序列中，相邻两数以2递增。下同)   当n mod 6 == 2 或 n mod 6 == 3时，(当n为偶数,k=n/2；当n为奇数,k=(n-1)/2)  k,k+2,k+4,...,n,2,4,...,k-2,k+3,k+5,...,n-1,1,3,5,...,k+1       (k为偶数,n为偶数) k,k+2,k+4,...,n-1,2,4,...,k-2,k+3,k+5,...,n-2,1,3,5,...,k+1,n   (k为偶数,n为奇数) k,k+2,k+4,...,n-1,1,3,5,...,k-2,k+3,...,n,2,4,...,k+1           (k为奇数,n为偶数) k,k+2,k+4,...,n-2,1,3,5,...,k-2,k+3,...,n-1,2,4,...,k+1,n       (k为奇数,n为奇数)

user: user-2
content: “给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出

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-3
content: 仅供参考 #include<stdio.h>      //八皇后 int n=1; int fun1(int b[]) {     int j,m;     for(j=0;j<7;j++)         for(m=j+1;m<8;m++)             if((b[m]-m)==(b[j]-j)||b[m]==b[j]||(b[m]+m)==(b[j]+j))return 0;     return 1; } int fun(int b[]) { int i,j; for(b[7]=0;b[0]<8;b[7]++) { if(b[0]>=8)return 0; for(i=7;i>0;i--)     if(b[i]>=8){b[i]=0;b[i-1]++;} if(fun1(b)) {     printf("%d\n",n++);     for(i=0;i<8;i++,printf("\n"))         for(j=0;j<8;j++)             if(b[i]!=j)printf("%2c",220);             else printf("%2c",5); } } } int main() {     int b[8]={0};     fun(b);     getchar();     return 0; }

user: user-4
content: 一维数组表示二维数组，没问题，对不能放棋的地方设置标志，也没问题。 重要的是，把这些组合起来写成代码的最后还是你，楼主要耐下心来一点一点写完。

user: user-0
content: 来个大侠完善下

user: user-0
content: #include<stdio.h> #include<stdlib.h> void initState(int p[]); void print(int p[]); int numOfPositive(int p[],int); void moveAway(int p[], int, int); int select(int p[], int ,int); int main() { 	int step =0; 	int selectPosition1; 	int selectPosition; 	int roomAvailable; 	int state[64]; 	initState(state); 	print(state); 	roomAvailable = numOfPositive(state, 64); 	while(roomAvailable > 0) 	{ 		sleep(100); 		printf("%d",roomAvailable); 		srand( time(NULL) ); 		selectPosition1 = rand()%roomAvailable; 		selectPosition = select(state,64,selectPosition1); 		moveAway(state,64,selectPosition); 		roomAvailable = numOfPositive(state, 64); 		printf("%d",roomAvailable); 		step++; 	} 	printf("%d",step); 	return 0; }  void initState(int p[]) { 	int i; 	int j; 	int k =0 ; 	for(i= 0; i<8; i++){ 		for(j=0; j<8; j++) 		{ 			p[k]= 10*i + j; 			k++; 		} 	} }  void print(int p[]) { 	int k = 0; 	while (k <64 ) 	{ 		printf("%2d ",p[k]); 		if((k+1)%8==0) 			printf("\n"); 		k++; 	} }  int numOfPositive(int p[],int m) { 	int i; 	int j = 0; 	for(i= 0; i<m; i++) 	{ 		if(p[i]>-1) 			j++; 	} 	return j; }  void moveAway(int p[], int m, int n) { 	int i; 	int j = p[n]/10 ; 	for(i= 0; i<m; i++) 	{ 		int k = abs(p[i]-p[n]); 		int j = p[n]%10 ; 		if(k%10==0||k%9==0||k%11==0) 			p[i]=-1; 		if(p[i]/10 == j) 			p[i]=-1; 	} }  int select(int p[],int m,int n) { 	int i; 	int j = -1; 	int k; 	for(i= 0; i<m; i++) 	{ 		if(p[i]>-1) 			j++; 		if(j == n) 		{ 			k = p[j]; 			break; 		} 	} 	return k; }