八皇后问题

 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         

 

posted @ 2012-12-13 20:42  萧凡客  阅读(169)  评论(0编辑  收藏  举报