【问题】8x8的矩阵,皇后所占的那一列、一竖都不能有其他皇后
    链接:https://baike.baidu.com/item/八皇后问题/11053477?fr=aladdin#1

    八皇后 - 图1

    1. #include<stdio.h>
    2. int count=0;//统计一共有几种
    3. int notDanger(int row,int j,int (*chess)[8]) {
    4. int i,k,flag1=0,flag2=0,flag3=0,flag4=0,flag5=0;
    5. //判断竖方向
    6. for (i=0; i<8; i++) {
    7. if ( chess[i][j] !=0 ) {
    8. flag1 = 1;
    9. break;
    10. }
    11. }
    12. //判断左上方
    13. for (i=row,k=j; i>=0&&k>=0; i--,k--) {
    14. if (chess[i][k]!=0) {
    15. flag2 = 1;
    16. break;
    17. }
    18. }
    19. //判断右下方
    20. for (i=row,k=j; i<8&&k<8; i++,k++) {
    21. if (chess[i][k]!=0) {
    22. flag3 = 1;
    23. break;
    24. }
    25. }
    26. //判断右上方
    27. for (i=row,k=j; i>=0&&k<8; i--,k++) {
    28. if (chess[i][k]!=0) {
    29. flag4 = 1;
    30. break;
    31. }
    32. }
    33. //左下方
    34. for (i=row,k=j; i<8&&k>0; i++,k--) {
    35. if (chess[i][k]!=0) {
    36. flag5 = 1;
    37. break;
    38. }
    39. }
    40. if (flag1 || flag2 || flag3 ||flag4 ||flag5)
    41. return 0;
    42. else
    43. return 1;
    44. }
    45. //row起始行 n列数 (*chess)[8]指向棋盘每一行的指针
    46. void eightQueen(int row,int n,int (*chess)[8] ) {
    47. int chess2[8][8],i,j;
    48. for (i=0; i<8; i++) {
    49. for (j=0; j<8; j++) {
    50. chess2[i][j]=chess[i][j];
    51. }
    52. }
    53. if (8 == row) {
    54. printf("第%d种\n",++count);
    55. for (i=0; i<8; i++) {
    56. for (j=0; j<8; j++) {
    57. printf("%d",chess2[i][j]);
    58. }
    59. printf("\n");
    60. }
    61. printf("\n");
    62. }
    63. else {
    64. //判断这个位置是否有危险
    65. //如果没有危险,继续往下
    66. for (j=0; j<n; j++) {
    67. if (notDanger(row,j,chess)) {//判断是否危险
    68. for(i=0; i<8; i++) {
    69. *(*(chess2+row)+i)=0;
    70. }
    71. *(*(chess2+row)+j)=1;
    72. eightQueen(row+1,n,chess2);
    73. }
    74. }
    75. }
    76. }
    77. int main() {
    78. int chess[8][8],i,j;
    79. for (i=0; i<8; i++) {
    80. for (j=0; j<8; j++) {
    81. chess[i][j]=0;
    82. }
    83. }
    84. eightQueen(0,8,chess);
    85. printf("总共有解决方法%d",count);
    86. return 0;
    87. }