微信图片_20210409135812.png

    1. #include <stdio.h>
    2. #include<stdbool.h>
    3. // 全局变量
    4. int place[8] = { 0 }; // 保存皇后的位置,下标为行,储存的数据为列。
    5. bool flag[8] = { 1, 1, 1, 1, 1, 1, 1, 1 }; // 用来保存哪一列已经存在皇后
    6. bool d1[15] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; // 从左上到右下的对角线为上对角线,每条上对角线上的行和列的差是一样的。
    7. bool d2[15] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; // 从左下到右下的对角线为下对角线,每条下对角线上的行和列的和是一样的。
    8. int number = 0; // 统计解的数量
    9. // 函数声明
    10. void QueenVIII(int); // 八皇后问题
    11. void output(void); // 输出
    12. // 主函数
    13. int main(void)
    14. {
    15. //output();
    16. QueenVIII(0);
    17. return 1;
    18. }
    19. void QueenVIII(int n) {
    20. int col;
    21. for (col = 0; col < 8;col++) {
    22. if (flag[col] && d1[n - col + 7] && d2[n + col]) {
    23. place[n] = col;
    24. flag[col]=false;
    25. d1[n - col + 7]=false;
    26. d2[n + col]=false;
    27. if (n < 7)
    28. QueenVIII(n + 1);
    29. else
    30. output();
    31. flag[col] =1;
    32. d1[n - col + 7] =1;
    33. d2[n + col] =1;
    34. }
    35. }
    36. }
    37. void output(void) {
    38. int tablet[8][8] = {0};
    39. int i, j, n;
    40. number++;
    41. printf("第%d种方法",number);
    42. printf("\n");
    43. for (n = 0; n < 8; n++)
    44. tablet[n][place[n]] = 1;
    45. for (i = 0; i < 8; i++)
    46. {
    47. for (j = 0; j < 8; j++)
    48. {
    49. printf("%d ", tablet[i][j]);
    50. }
    51. printf("\n");
    52. }
    53. }