n皇后问题c语言递归
时间: 2023-12-01 20:40:33 浏览: 79
n皇后问题是一个经典的问题,目标是在一个n×n的棋盘上放置n个皇后,使得每个皇后都不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上。下面是两个C语言递归实现n皇后问题的代码:
引用:
```c
#include<stdio.h>
#define MAX 10
#define n 4 //4个皇后
int a[MAX];//第i个皇后在a[i]上
int sum = 0;
int detection(int x,int y) {//判断是否能放
for (int i = 1; i <= x; i++) {
if (a[i] == y)return 0;//|有皇后
if (i + a[i] == x + y)return 0;//斜边右边有皇后
if (i - a[i] == x - y)return 0;//斜边左边有皇后
}
return 1;//可以放皇后
}
void queen(int row) {//第row个皇后在?
if (row == n + 1) {
sum++;//完成了一组解答
printf("解法%d:",sum);
for (int k = 1; k < n; k++) {
printf("%d", a[k]);
}
printf("\n");
return;
}
for (int i = 1; i <= n; i++) {
if (detection(row, i)) {
a[row] = i;
queen(row + 1);
a[row] = 0;//回溯
}
}
}
int main() {
queen(1);
printf("有%d种解法\n", sum);
return 0;
}
```
引用:
```c
#include<iostream>
using namespace std;
#define max 5
void dis(int chess[max][max],int n) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++)
cout << chess[i][j] << " ";
cout << endl;
}
cout << endl;
}
bool place(int chess[max][max],int n, int x, int y) {
if (x == 0) return true;
else {
for (int i = 0; i < x; i++) {
for (int j = 0; j < n; j++) {
if (chess[i][j] == 1) {
if (j == y || abs(i - x) == abs(j - y)) return false;
}
}
}
}
return true;
}
void queen(int chess[max][max],int n,int i) {
if (i == n) dis(chess, n);
for (int j = 0; j < n; j++) {
if (place(chess, n, i, j)) {
chess[i][j] = 1;
queen(chess, n, i + 1);
chess[i][j] = 0;
}
}
}
int main() {
int chess[max][max];
memset(chess, 0, sizeof(chess));
queen(chess, max, 0);
return 0;
}
```
阅读全文