n皇后问题回溯法c语言
时间: 2023-08-13 21:34:51 浏览: 101
以下是n皇后问题的回溯法C语言实现:
```c
#include <stdio.h>
#define N 8
int board[N][N];
int is_attack(int i,int j) {
int k,l;
//检查列是否有皇后冲突
for(k=0;k<N;k++) {
if((board[i][k] == 1) || (board[k][j] == 1))
return 1;
}
//检查对角线是否有皇后冲突
for(k=0;k<N;k++) {
for(l=0;l<N;l++) {
if(((k+l) == (i+j)) || ((k-l) == (i-j))) {
if(board[k][l] == 1)
return 1;
}
}
}
return 0;
}
int n_queen(int n) {
int i,j;
if(n==0)
return 1;
for(i=0;i<N;i++) {
for(j=0;j<N;j++) {
if((!is_attack(i,j)) && (board[i][j]!=1)) {
board[i][j] = 1;
if(n_queen(n-1)==1) {
return 1;
}
board[i][j] = 0;
}
}
}
return 0;
}
int main() {
int i,j;
for(i=0;i<N;i++) {
for(j=0;j<N;j++) {
board[i][j]=0;
}
}
n_queen(N);
//打印结果
for(i=0;i<N;i++) {
for(j=0;j<N;j++) {
printf("%d ",board[i][j]);
}
printf("\n");
}
return 0;
}
```
该程序使用回溯法来解决n皇后问题。is_attack()函数检查给定位置是否与其他皇后冲突,n_queen()函数使用递归来尝试在棋盘上放置皇后。如果成功,返回1,否则返回0。在main()函数中,棋盘被初始化为0,然后n_queen()函数被调用来求解问题。最后,结果被打印在控制台上。
阅读全文