八皇后问题是经典的回溯算法问题,它要求在一个 8×8的国际象棋棋盘上放置八个皇后,使得任意两个皇后都不能互相攻击。具体来说,任何两个皇后都不能在同一行、同一列或同一对角线上。
下面是一个用C语言实现八皇后问题的代码,并输出耗时:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 8
int board[N][N];
// 检查是否可以在 (row, col) 放置皇后
int isSafe(int row, int col) {
int i, j;
// 检查该列上方的所有行
for (i = 0; i < row; i++) {
if (board[i][col]) {
return 0;
}
}
// 检查左上方的对角线
for (i = row, j = col; i >= 0 && j >= 0; i--, j--) {
if (board[i][j]) {
return 0;
}
}
// 检查右上方的对角线
for (i = row, j = col; i >= 0 && j < N; i--, j++) {
if (board[i][j]) {
return 0;
}
}
return 1;
}
// 解决八皇后问题的递归函数
int solveNQueens(int row) {
if (row >= N) {
return 1; // 成功放置了所有皇后
}
for (int col = 0; col < N; col++) {
if (isSafe(row, col)) {
board[row][col] = 1; // 放置皇后
// 递归放置下一行的皇后
if (solveNQueens(row + 1)) {
return 1;
}
// 如果放置失败,则回溯
board[row][col] = 0;
}
}
return 0; // 未能放置皇后
}
// 打印棋盘
void printBoard() {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
printf("%d ", board[i][j]);
}
printf("\n");
}
}
int main() {
clock_t start, end;
double cpu_time_used;
// 初始化棋盘
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
board[i][j] = 0;
}
}
// 开始计时
start = clock();
if (solveNQueens(0)) {
printBoard();
} else {
printf("没有解决方案。\n");
}
// 结束计时
end = clock();
cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;
printf("耗时: %f 秒\n", cpu_time_used);
return 0;
}
代码说明
isSafe函数:检查是否可以在指定位置放置皇后。solveNQueens函数:递归地尝试在棋盘上放置皇后,直到找到一个有效的解。printBoard函数:输出棋盘的当前状态,展示皇后的位置。- 主函数 (
main):- 初始化棋盘。
- 开始计时。
- 调用
solveNQueens函数解决问题并输出棋盘。 - 输出运行时间。
编译与运行
编译:
gcc -o nqueens nqueens.c
运行
./nqueens
4827

被折叠的 条评论
为什么被折叠?



