用C语言写出八皇后问题的解法代码
时间: 2023-03-20 21:01:53 浏览: 117
八皇后问题是经典的回溯算法问题,以下是使用C语言编写的解法代码:
```c
#include <stdio.h>
#define N 8 //定义棋盘大小
int chessboard[N][N]; //棋盘,1表示该位置有皇后,0表示无皇后
//判断放置皇后的位置是否合法
int check(int row, int col)
{
int i, j;
//检查该列是否有皇后
for (i = 0; i < row; i++)
if (chessboard[i][col])
return 0;
//检查左上方是否有皇后
for (i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--)
if (chessboard[i][j])
return 0;
//检查右上方是否有皇后
for (i = row - 1, j = col + 1; i >= 0 && j < N; i--, j++)
if (chessboard[i][j])
return 0;
return 1; //合法位置
}
//输出皇后的位置
void print_solution()
{
int i, j;
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
printf("%d ", chessboard[i][j]);
printf("\n");
}
printf("\n");
}
//回溯求解八皇后问题
void solve(int row)
{
int i;
if (row == N) //找到一个解
print_solution();
else
{
for (i = 0; i < N; i++)
{
if (check(row, i)) //检查该位置是否合法
{
chessboard[row][i] = 1; //放置皇后
solve(row + 1); //继续处理下一行
chessboard[row][i] = 0; //回溯,撤销皇后的位置
}
}
}
}
int main()
{
solve(0); //从第一行开始求解
return 0;
}
```
该程序使用了一个二维数组 `chessboard` 来表示棋盘,1表示该位置有皇后,0表示无皇后。 `check()` 函数用来判断放置皇后的位置是否合法,该函数会检查该列、左上方和右上方是否有皇后。 `print_solution()` 函数用来输出找到的皇后位置。 `solve()` 函数是核心函数,它使用回溯算法来求解八皇后问题,从第一行开始逐行放置皇后,每放置一个皇后就继续处理下一行,如果某一行找不到合适的位置则回溯到上一行重新放置皇后。主函数调用 `solve()` 函数并从第一行开始求解。
阅读全文