c语言求解n皇后问题
时间: 2023-08-13 09:15:05 浏览: 85
n皇后问题的解决(c语言)
n皇后问题是指在一个 n × n 的棋盘上放置 n 个皇后,使得皇后之间不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上。下面是一种使用回溯法求解n皇后问题的C语言实现代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define N 8
int board[N][N] = {0}; // 棋盘,0表示空,1表示皇后
void print_board() { // 打印棋盘
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
printf("%c ", board[i][j] ? 'Q' : '.');
}
printf("\n");
}
printf("\n");
}
int check(int row, int col) { // 检查该位置是否可以放置皇后
for (int i = 0; i < row; i++) {
if (board[i][col] == 1) { // 同一列
return 0;
}
if (col-row+i >= 0 && board[i][col-row+i] == 1) { // 左上方
return 0;
}
if (col+row-i < N && board[i][col+row-i] == 1) { // 右上方
return 0;
}
}
return 1;
}
void backtrace(int row) { // 回溯法
if (row == N) { // 找到一组解
print_board();
return;
}
for (int i = 0; i < N; i++) {
if (check(row, i)) {
board[row][i] = 1; // 放置皇后
backtrace(row + 1); // 继续下一行
board[row][i] = 0; // 回溯
}
}
}
int main() {
backtrace(0); // 从第0行开始
return 0;
}
```
在该代码中,使用二维数组 `board` 表示棋盘,其中0表示空,1表示皇后。`check` 函数用于检查该位置是否可以放置皇后,其检查同一列和同一斜线。`backtrace` 函数采用回溯法,从第0行开始,依次尝试每一列,如果该位置可以放置皇后,则继续下一行;如果该位置不行,则回溯到上一行重新尝试。当找到一组解时,调用 `print_board` 函数打印棋盘。最后在 `main` 函数中调用 `backtrace` 函数即可求解n皇后问题。
阅读全文