6_6.C
上传用户:wyn840322
上传日期:2007-01-13
资源大小:294k
文件大小:4k
源码类别:

数据结构

开发平台:

C/C++

  1. /* ======================================== */
  2. /*    程式实例: 6_6.c                       */
  3. /*    应用递归来解 N 皇后问题               */
  4. /*    数字 1: 表示是放置皇后                */
  5. /*    数字 0: 表示没有放置                  */
  6. /* ======================================== */
  7. #define MAXQUEEN   8              /* 最大放置的皇后数   */
  8. int pad[MAXQUEEN][MAXQUEEN] = {   /* N X N 的棋盘       */
  9.          0, 0, 0, 0, 0, 0, 0, 0,
  10.          0, 0, 0, 0, 0, 0, 0, 0,
  11.          0, 0, 0, 0, 0, 0, 0, 0,
  12.          0, 0, 0, 0, 0, 0, 0, 0,
  13.          0, 0, 0, 0, 0, 0, 0, 0,
  14.          0, 0, 0, 0, 0, 0, 0, 0,
  15.          0, 0, 0, 0, 0, 0, 0, 0,
  16.          0, 0, 0, 0, 0, 0, 0, 0  };
  17. /* ---------------------------------------- */
  18. /*  放 N 个皇后的递归函数                   */
  19. /* ---------------------------------------- */
  20. int put_queen(int x,int y,int times)
  21. {
  22.    int i,j,result = 0;
  23.    if ( times > MAXQUEEN )        /* 终止条件           */
  24.       return 1;
  25.    else
  26.       if ( place(x,y) )           /* 检查是否可放置皇后 */
  27.       {
  28.          pad[x][y] = 1;           /* 放置皇后           */
  29.          for ( i = 0; i < MAXQUEEN; i++)
  30.             for ( j = 0; j < MAXQUEEN; j++)
  31.             {
  32.                /* 递归调用放置下一个皇后 */
  33.                result += put_queen(i,j,times + 1);
  34.                if ( result > 0 )
  35.                   break;
  36.             }
  37.          if ( result > 0 )        /* 找到了解           */
  38.             return 1;
  39.          else
  40.          {
  41.             pad[x][y] = 0;        /* 清除皇后           */
  42.             return 0;
  43.          }
  44.       }
  45.       else
  46.          return 0;
  47. }
  48. /* ---------------------------------------- */
  49. /*  检查皇后是否有相互攻击                  */
  50. /* ---------------------------------------- */
  51. int place(int x,int y)
  52. {
  53.    int x1,y1;
  54.    if ( pad[x][y] != 0 )          /* 己放置皇后         */
  55.       return 0;
  56.    x1 = x - 1;                    /* 检查左上方         */
  57.    y1 = y - 1;
  58.    while ( x1 >= 0 && y1 >= 0 )
  59.       if ( pad[x1--][y1--] != 0 )
  60.          return 0;
  61.    x1 = x + 1;                    /* 检查右下方         */
  62.    y1 = y + 1;
  63.    while ( x1 < MAXQUEEN && y1 < MAXQUEEN )
  64.       if ( pad[x1++][y1++] != 0 )
  65.          return 0;
  66.    x1 = x + 1;                    /* 检查右上方         */
  67.    y1 = y - 1;
  68.    while ( x1 < MAXQUEEN && y1 >= 0 )
  69.       if ( pad[x1++][y1--] != 0 )
  70.          return 0;
  71.    x1 = x - 1;                    /* 检查左下方         */
  72.    y1 = y + 1;
  73.    while ( x1 >=0 && y1 < MAXQUEEN )
  74.       if ( pad[x1--][y1++] != 0 )
  75.          return 0;
  76.    x1 = x;                        /* 检查下方           */
  77.    y1 = y + 1;
  78.    while ( y1 < MAXQUEEN )
  79.       if ( pad[x1][y1++] != 0 )
  80.          return 0;
  81.    x1 = x;                        /* 检查上方           */
  82.    y1 = y - 1;
  83.    while ( y1 >= 0 )
  84.       if ( pad[x1][y1--] != 0 )
  85.          return 0;
  86.    x1 = x + 1;                    /* 检查右方           */
  87.    y1 = y;
  88.    while ( x1 < MAXQUEEN )
  89.       if ( pad[x1++][y1] != 0 )
  90.          return 0;
  91.    x1 = x - 1;                    /* 检查左方           */
  92.    y1 = y;
  93.    while ( x1 >= 0 )
  94.       if ( pad[x1--][y1] != 0 )
  95.          return 0;
  96.    return 1;
  97. }
  98. /* ---------------------------------------- */
  99. /*  主程式: 用递归的方法解 N = 8 皇后问题.  */
  100. /* ---------------------------------------- */
  101. void main()
  102. {
  103.    int i,j;
  104.    put_queen(0,0,1);              /* 调用递归函数       */
  105.    printf("放置八皇后的棋盘图形:n");
  106.    for ( i = 0; i < MAXQUEEN; i++)   /* 印出棋盘的图形  */
  107.    {
  108.       for ( j = 0; j < MAXQUEEN; j++)
  109.          printf("%d",pad[i][j]);  /* 印出各座标值       */
  110.       printf("n");               /* 换行               */
  111.    }
  112. }