1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | #include <stdio.h> #include <stdlib.h> #include <string.h> #define N 8 int count = 0; void print(int (*a)[N]) { count ++; int i = 0; int j = 0; for(i=0; i<N; i++) { for(j=0; j<N; j++) printf(" %d", a[i][j]); printf("\n"); } printf("\n\n"); } //在a[i][j]处放一个皇后 void set(int (*a)[N], int i, int j) { a[i][j] = 1; } //判断a[i][j]是否有皇后 int is_set(int (*a)[N], int i, int j) { return a[i][j] == 1; } //清除a[i][j]处的皇后 void clear(int (*a)[N], int i, int j) { a[i][j] = 0; } //判断a[i][j]处的皇后是否与其他皇后冲突 int conflict(int (*a)[N], int i, int j) { int row = i; int colum = j; for(--i, --j; i>=0 && j>=0; i--, j--) // 斜对角 if(is_set(a, i, j)) return 1; i = row; j = colum; for(--i, ++j; i>=0 && j<=N-1; i--, j++) // 斜对角 if(is_set(a, i, j)) return 1; i = row; j = colum; for(--i; i>=0; i--) // 同一列 if(is_set(a, i, j)) return 1; return 0; } void queen(int (*a)[N], int i) { if(i == N) // 如果已经放了N个皇后,打印并返回 { print(a); return; } int j = 0; for(j=0; j<N; j++) // 放第i(0 ~ N-1)个皇后,每个位置都试。 { set(a, i, j); if(!conflict(a, i, j)) queen(a, i+1); clear(a, i, j); } } int main() { int a[N][N]; memset(a, 0, sizeof(a)); queen(a, 0); printf("%d\n", count); return 0; } |
August 26, 2010

这个算法写得很清楚,比书上或网上的算法更容易理解
可能是函数写的多一些。你看,有的函数就一行,其实都用不着函数。但我觉得写成个函数有助于理解。如果把这个程序写成一个函数,应该难理解一些。
是的 ,这样写很好,清晰,同时降低了耦合度
嗯。如果速度很重要的话,就把那些小函数改成宏(C语言)。或者inline(C++语言)。