void fill_queens(int mat[N_QUEEN][N_QUEEN]) { int prob[N_QUEEN] = {0}; int m = 0, n = 0, nqueens = 0; while (1) { for (m = 0;m >= 0 && m < N_QUEEN;) { while ((m < N_QUEEN) && (prob[m] < N_QUEEN)) { if (!is_conflict(mat, m, prob[m])) { mat[m][prob[m]] = 1; nqueens++; m++; continue; } prob[m]++; } if (nqueens == N_QUEEN) break; while (prob[m] >= N_QUEEN) { print_board(mat); printf ("\n"); assert(m); prob[m] = 0; m--; assert(mat[m][prob[m]]); mat[m][prob[m]] = 0; prob[m]++; nqueens--; } } if (nqueens == N_QUEEN) break; } }
// 解决N皇后问题 int queen(int n) { int count = 0; int a[MAX_LENGTH]; init_board(a, n); int i = 0; while ( 1 ) { if ( a[i] < n ) { // 如果皇后的位置尚未超出棋盘范围 // 需要检查第i行的皇后是否与前i-1行的皇后冲突 if ( is_conflict(a, i) ) { // 如果冲突,尝试下一个位置 a[i]++; continue; } if ( i >= n - 1 ) { // 如果已经到最后一行,也即找到一个解,首先输出它 count++; print_board(a, n); // 然后尝试当前行的皇后的下一个位置 a[n-1]++; continue; } // 没有冲突,尝试下一行 i++; continue; } else { // 皇后的位置已经超出棋盘范围 // 那么该行的皇后复位 a[i] = 0; // 可以省略...?? // 回退到上一行 i--; if ( i < 0 ) { // 已经不能再退了,函数结束 return count; } // 尝试上一行的皇后的下个位置 a[i]++; continue; } } }