八皇后问题的递归实现

2100阅读 0评论2015-09-19 九阳神功爱喝茶
分类:C/C++

暴力递归实现的,这里我吸取的教训是在再次暴力递归之前,要注意i++,然后修改a[i][j]的值;当这个不满足返回这条语句的时候也要回复这个值,因此要先i--,然后修改a[i][j]的值。。。

点击(此处)折叠或打开

  1. #include<stdio.h>
  2. #include<math.h>
  3. #define MAX_LEN 8
  4. int times=0;
  5. print(int a[MAX_LEN][MAX_LEN]) {
  6.     times++;
  7.     for (int i = 0; i < MAX_LEN; i++) {
  8.         for (int j = 0; j < MAX_LEN; j++) {
  9.             printf("%d ", a[i][j]);
  10.         }
  11.         printf("\n");
  12.     }
  13.     printf("\n");
  14. }

  15. //判断是否处于同一条线
  16. int IsSameLine(int a[MAX_LEN][MAX_LEN], int i, int j) {
  17.     for (int m = 0; m < i; m++) {
  18.         for (int k = 0; k < MAX_LEN; k++) {
  19.             if (a[m][k] == 1 && (abs(i - m) == abs(k - j)||k==j)) {
  20.                 return 1;
  21.             }
  22.         }
  23.     }
  24.     return 0;
  25. }


  26. Trial(int a[MAX_LEN][MAX_LEN], int i) {
  27.     if (i == MAX_LEN)
  28.         print(a);
  29.     int j = 0;
  30.     for (; j < MAX_LEN ; j++) {
  31.         if (!IsSameLine(a, i, j)) {
  32.             //作为标记,1表示摆放
  33.             a[i][j] = 1;
  34.             i++;
  35.             Trial(a, i);    
  36.             //不满足要求之后,要恢复原值
  37.             i--;
  38.             a[i][j] = 0;
  39.         }
  40.     }
  41. }
  42. int main(void) {
  43.     int a[MAX_LEN][MAX_LEN];
  44.     for (int i = 0; i < MAX_LEN; i++)
  45.     {
  46.         for (int j = 0; j < MAX_LEN; j++) {
  47.             a[i][j] = 0;
  48.         }
  49.     }
  50.     Trial(a, 0);
  51.     printf("%d", times);
  52. }

上一篇:最长递增和递减序列序列的暴力求解---C语言版
下一篇:迷宫问题的回溯与递归