#include <stdio.h>
#define MAX 14
int count = 0;
//用来排除对角线和下方是否有皇后的问题
int Go(int row, int col, int n, int (*chess)[MAX]) {
int i, j, flag1, flag2, flag3, flag4, flag5;
flag1 = flag2 = flag3 = flag4 = flag5 = 0;
//同一行
for(i=0; i<n; i++) {
if(chess[i][col] != 0) {
flag1 = 1;
break;
}
}
//左上方
for(i=row, j=col; i>=0&&j>=0; i--, j--) {
if(chess[i][j] != 0) {
flag2 = 1;
break;
}
}
//右下方
for(i=row, j=col; i<n&&j<n; i++, j++) {
if(chess[i][j] != 0) {
flag3 = 1;
break;
}
}
//左下方
for(i=row, j=col; i<n&&j>=0; i++, j--) {
if(chess[i][j] != 0) {
flag4 = 1;
break;
}
}
//右上方
for(i=row, j=col; i>=0&&j<n; i--, j++) {
if(chess[i][j] != 0) {
flag5 = 1;
break;
}
}
if(flag1 || flag2 || flag3 || flag4 || flag5)
return 0;
else
return 1;
}
//row行, col列 ,n矩阵的阶数
void Queen(int row, int n, int (*chess)[MAX]) {
int i, j;
int chess2[MAX][MAX];
for(i=0; i<n; i++) {
for(j=0; j<n; j++) {
chess2[i][j] = chess[i][j];
}
}
if(row == n) {
//printf("第%d种方式:\n", ++count);
for(i=0; i<n; i++) {
for(j=0; j<n; j++)
if (chess[i][j] != 0)
printf("%d ", j+1);
}
printf("\n");
}
else {
for(j=0; j<n; j++) {
if(Go(row, j, n, chess)) {
for(i=0; i<n; i++)
chess2[row][i] = 0;
chess2[row][j] = 1;
Queen(row+1, n, chess2);
}
}
}
}
int main(void) {
int m, i, j;
int chess[MAX][MAX] = {0};
scanf("%d", &m);
for(i=0; i<m; i++) {
for(j=0; j<m; j++) {
chess[i][j] = 0;
}
}
Queen(0, m, chess);
return 0;
}
N皇后问题(递归法)
最新推荐文章于 2022-10-19 14:59:12 发布