八皇后问题

 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         

 

你可能感兴趣的:(八皇后)