n皇后问题是一个著名的搜索问题,其目标是在 n x n 的国际象棋棋盘上放置 n 个皇后,使得它们不能互相攻击。在这个问题中,皇后可以攻击同一行、同一列或同一斜线上的任何单位。
下面是一个用 C 语言实现的递归函数,用于解决 n 皇后问题。在这个函数中,参数 queens 数组用于存储当前摆放的皇后的位置,row 表示当前要放置皇后的行,n 表示棋盘的大小。
``` #include <stdio.h> #include <stdbool.h>
// 返回 true 表示 (row, col) 这个位置可以放置皇后 bool is_safe(int queens[], int row, int col, int n) { // 检查列是否合法 for (int i = 0; i < row; i++) { if (queens[i] == col) { return false; } }
// 检查左上方是否合法 for (int i = row, j = col; i >= 0 && j >= 0; i--, j--) { if (queens[i] == j) { return false; } }
// 检查右上方是否合法 for (int i = row, j = col; i >= 0 && j < n; i--, j++) { if (queens[i] == j) { return false; } }
return true; }
// 递归函数,尝试在第 row 行放置皇后 bool solve_n_queens(int queens[], int row, int n) { if (row == n) { // 找到了一组解,打印输出 for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (queens[i] == j) { printf("Q