给出解决八皇后问题的c++代码
时间: 2023-09-18 21:06:16 浏览: 121
八皇后问题C++ 代码
### 回答1:
以下是使用C语言解决八皇后问题的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define N 8
int board[N][N] = {0}; // 用于存储棋盘
int count = 0; // 解的数量
// 打印解法
void print_solution() {
int i, j;
printf("Solution %d:\n", ++count);
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
printf("%c ", board[i][j] ? 'Q' : '.');
}
printf("\n");
}
}
// 检查是否可以在(row, col)位置放置皇后
int check(int row, int col) {
int i, j;
// 检查列
for (i = 0; i < row; i++) {
if (board[i][col]) {
return 0;
}
}
// 检查左上方
for (i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) {
if (board[i][j]) {
return 0;
}
}
// 检查右上方
for (i = row - 1, j = col + 1; i >= 0 && j < N; i--, j++) {
if (board[i][j]) {
return 0;
}
}
return 1;
}
// 解决八皇后问题
void solve(int row) {
int col;
// 找到解
if (row == N) {
print_solution();
return;
}
// 在每一列尝试放置皇后
for (col = 0; col < N; col++) {
if (check(row, col)) {
board[row][col] = 1;
solve(row + 1);
board[row][col] = 0;
}
}
}
int main() {
solve(0);
return 0;
}
```
该代码使用递归算法解决八皇后问题,通过在每一行中尝试在每一列中放置一个皇后,然后递归到下一行,直到找到解为止。在找到解时,该代码会将解打印出来。
### 回答2:
以下是一个用C代码解决八皇后问题的示例:
```c
#include <stdio.h>
#define N 8
void printSolution(int board[N][N]) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
printf("%2d ", board[i][j]);
}
printf("\n");
}
printf("\n");
}
int isSafe(int board[N][N], int row, int col) {
// 检查同一行是否有皇后
for (int i = 0; i < col; i++) {
if (board[row][i]) {
return 0;
}
}
// 检查左上对角线是否有皇后
for (int i = row, j = col; i >= 0 && j >= 0; i--, j--) {
if (board[i][j]) {
return 0;
}
}
// 检查左下对角线是否有皇后
for (int i = row, j = col; i < N && j >= 0; i++, j--) {
if (board[i][j]) {
return 0;
}
}
return 1;
}
int solveNQueens(int board[N][N], int col) {
if (col == N) {
// 所有皇后都已放置,打印解决方案
printSolution(board);
return 1;
}
int count = 0;
for (int i = 0; i < N; i++) {
if (isSafe(board, i, col)) {
// 递归放置下一个皇后
board[i][col] = 1;
count += solveNQueens(board, col + 1);
// 回溯,将该位置重新置为0
board[i][col] = 0;
}
}
return count;
}
int main() {
int board[N][N] = {0}; // 初始化棋盘
int totalSolutions = solveNQueens(board, 0);
printf("Total solutions: %d\n", totalSolutions);
return 0;
}
```
这是一个经典的回溯算法解决八皇后问题的实现。它使用递归的方式依次将皇后放置在每一列,然后检查当前位置是否安全,即是否与已放置的皇后冲突(同行、同列或对角线)。如果安全,递归调用下一列的放置。当所有皇后都已放置,即col达到N时,打印解决方案并返回1。在每一列中,对于每一行,都会尝试放置皇后并继续递归。如果找到了一个解决方案,则计数器count增加1,并进行回溯,重置该位置并尝试下一个可能的位置。
在主函数中,我们初始化棋盘并调用solveNQueens函数开始解决八皇后问题。最后,我们输出总解决方案的数量。
### 回答3:
八皇后问题是指在8×8的国际象棋上摆放八个皇后,使得它们彼此之间无法攻击到对方。以下是一个C语言解决八皇后问题的代码示例:
```
#include <stdio.h>
#define N 8
int board[N][N];
// 检查在特定位置(row, col)上是否可以放置皇后
int canPlaceQueen(int row, int col) {
int i, j;
// 检查当前列上是否已经有皇后
for (i = 0; i < row; i++) {
if (board[i][col] == 1) {
return 0;
}
}
// 检查当前位置的左上方是否有皇后
for (i = row, j = col; i >= 0 && j >= 0; i--, j--) {
if (board[i][j] == 1) {
return 0;
}
}
// 检查当前位置的右上方是否有皇后
for (i = row, j = col; i >= 0 && j < N; i--, j++) {
if (board[i][j] == 1) {
return 0;
}
}
return 1;
}
// 使用回溯法求解八皇后问题
int solveNQueens(int row) {
int i;
// 完成所有行的放置,则找到了一个解
if (row >= N) {
return 1;
}
// 遍历当前行的每一列
for (i = 0; i < N; i++) {
// 检查当前位置是否可以放置皇后
if (canPlaceQueen(row, i) == 1) {
// 在当前位置放置皇后
board[row][i] = 1;
// 递归地检查下一行是否可以放置皇后
if (solveNQueens(row + 1) == 1) {
return 1;
}
// 如果下一行不能放置皇后,则回溯,尝试下一个位置
board[row][i] = 0;
}
}
return 0;
}
// 打印解决八皇后问题的结果
void printSolution() {
int i, j;
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
printf("%d ", board[i][j]);
}
printf("\n");
}
}
int main() {
if (solveNQueens(0) == 1) {
printSolution();
} else {
printf("No solution found.");
}
return 0;
}
```
以上是八皇后问题的C语言解决代码。代码中使用回溯法递归地在每一行的每一列尝试放置皇后,通过检查当前位置的列、左上方和右上方是否已经有皇后来确定是否可以放置。如果成功放置所有皇后,则打印出结果;否则输出无解。
阅读全文