1 /*N皇后问题*/
2 #include<stdio.h>
3 #include<string.h>
4 int a[20][20];//N皇后矩阵
5 int v[3][20];//v[0][i]表示列是否冲突;v[1][i]表示副对角线是否冲突; v[2][i]表示正对角线是否冲突
6 int n;//N皇后
7 int c[1000][20];//存放条件成立的结果
8 int num;
9
10
11 void fun(int cur)
12 {
13 int i;
14 if(cur==n)
15 {
16 num++;
17 return ;
18 }
19
20 for(i=0;i<n;i++)
21 {
22 if(!v[0][i] &&!v[1][i+cur]&&!v[2][cur-i+n])
23 {
24 c[num][cur]=i;//c[num][cur]存放的是num个结果中的 第cur行第i列是皇后
25 v[0][i] =v[1][i+cur]=v[2][cur-i+n]=1;
26 fun(cur+1);
27 v[0][i] =v[1][i+cur]=v[2][cur-i+n]=0;
28 }
29 }
30 }
31
32 void pint()
33 {
34 int i,a,b;
35 FILE *p;
36 p=fopen("八皇后.txt","w");
37 for(i=0;i<num;i++)
38 {
39 fprintf(p,"%d\n",i+1);
40 for(a=0;a<n;a++)
41 {
42 for(b=0;b<n;b++)
43 if(c[i][a]==b)//c[num][cur]存放的是num个结果中的 第cur行第i列是皇后
44 //printf("1 ");
45 fprintf(p,"1 ");
46 else
47 // printf("0 ");
48 fprintf(p,"0 ");
49 fprintf(p,"\n");
50 }
51 fprintf(p,"\n");
52 }
53 fclose(p);
54 }
55
56 int main()
57 {
58 while(scanf("%d",&n))
59 {
60 memset(a,0,sizeof(a));
61 memset(v,0,sizeof(v));
62 memset(c,0,sizeof(c));
63 num=0;
64 fun(0);
65 printf("%d\n",num);
66 pint();
67 }
68 return 0;
69 }
70
71
72
73