问题描述:
N 皇后问题是指在 n * n 的棋盘上要摆 n 个皇后,
要求:任何两个皇后不同行,不同列也不在同一条斜线上,
求给一个整数 n ,返回 n 皇后的摆法数。
数据范围: 1≤n≤9
要求:空间复杂度:O(1) ,时间复杂度 :O(n!)
解决思路:
首先,我们可以先判断两个皇后是否不同行,不同列且不在同一条斜线上
// 判断当前位置是否可以放置皇后
bool isSafe(int board[MAX_N][MAX_N], int row, int col, int n)
{
int i, j;
// 检查当前列是否有其他皇后
for (i = 0; i < row; i++)
{
if (board[i][col] == 1)
{
return false;
}
}
// 检查左上方对角线是否有其他皇后
for (i = row, j = col; i >= 0 && j >= 0; i--, j--)
{
if (board[i][j] == 1)
{
return false;
}
}
// 检查右上方对角线是否有其他皇后
for (i = row, j = col; i >= 0 && j < n; i--, j++)
{
if (board[i][j] == 1)
{
return false;
}
}
return true;
}
使用回溯法求解 N 皇后问题
// 使用回溯法求解 N 皇后问题
void solveNQueens(int board[MAX_N][MAX_N], int row, int n)
{
int col;
// 如果已经摆放完所有皇后,则找到一种解法,计数器加一
if (row == n)
{
count++;
return;
}
// 尝试在当前行的每个位置放置皇后
for (col = 0; col < n; col++)
{
// 如果当前位置可以放置皇后,则继续递归下一行
if (isSafe(board, row, col, n))
{
board[row][col] = 1;
solveNQueens(board, row + 1, n);
board[row][col] = 0; // 回溯,撤销当前位置的皇后
}
}
}
int totalNQueens(int n)
{
int board[MAX_N][MAX_N] = {0};
count = 0;
solveNQueens(board, 0, n);
return count;
}
结合上面思路,下面是全部代码:
#include <stdio.h>
#include <stdbool.h>
#define MAX_N 9
int count = 0; // 计数器,用于统计摆放方法数
// 判断当前位置是否可以放置皇后
bool isSafe(int board[MAX_N][MAX_N], int row, int col, int n)
{
int i, j;
// 检查当前列是否有其他皇后
for (i = 0; i < row; i++)
{
if (board[i][col] == 1)
{
return false;
}
}
// 检查左上方对角线是否有其他皇后
for (i = row, j = col; i >= 0 && j >= 0; i--, j--)
{
if (board[i][j] == 1)
{
return false;
}
}
// 检查右上方对角线是否有其他皇后
for (i = row, j = col; i >= 0 && j < n; i--, j++)
{
if (board[i][j] == 1)
{
return false;
}
}
return true;
}
// 使用回溯法求解 N 皇后问题
void solveNQueens(int board[MAX_N][MAX_N], int row, int n)
{
int col;
// 如果已经摆放完所有皇后,则找到一种解法,计数器加一
if (row == n)
{
count++;
return;
}
// 尝试在当前行的每个位置放置皇后
for (col = 0; col < n; col++)
{
// 如果当前位置可以放置皇后,则继续递归下一行
if (isSafe(board, row, col, n))
{
board[row][col] = 1;
solveNQueens(board, row + 1, n);
board[row][col] = 0; // 回溯,撤销当前位置的皇后
}
}
}
int totalNQueens(int n)
{
int board[MAX_N][MAX_N] = {0};
count = 0;
solveNQueens(board, 0, n);
return count;
}
int main()
{
int n;
printf("请输入 N 的值:");
scanf("%d", &n);
int result = totalNQueens(n);
printf("N 皇后问题的摆法数为:%d\n", result);
return 0;
}