方法一:用二维数组的0 1值来确定皇后位置的安放。
方法二:用一维数组来解决8后问题,下标代表行数,下标上的数值代表列数
一下代码:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
//用二维数组解决8后问题
int Iscolumn(int (*a)[10],int column,int i,int n) {
int i1, p1,j;
for (j= 0; j < i; j++) {
if (a[j][column])
return 0;
}
//判断左上角的斜线
for (i1 = i-1, p1 = column-1; i1 >= 0 && p1 >= 0; i1--, p1--) {
if (a[i1][p1])
return 0;
}
//判断右上角的斜线,注意列数范围的改动
for (i1 = i-1, p1 = column+1; i1 >= 0 && p1 <n; i1--, p1++) {
if (a[i1][p1])
return 0;
}
return 1;
}
void eightQueen(int i,int (*a)[10],int n) {//int *a[10] 为int**型 不能调用二维数组
//想要在函数里调用主函数中的二维数组,必须用a[10][10]或 a[][10]或(*a)[10](其表示对行取指针)来调用
//表示要对多维数组的某个部位取地址,可用括号指针圈起来
int j, k;
static int cnt = 1;
if ( i== n) {
printf("第%d次%d后问题为:\n", cnt++, n);
for (j = 0; j < n; j++)
for (k = 0; k < n; k++) {
if (k == n-1)printf("%d\n", a[j][k]);
else
printf("%d ", a[j][k]);
}
}
else {
for (int column = 0; column < n; column++) {
if (Iscolumn(a,column,i,n)) {
for (j = 0; j < n; j++)
a[i][j] = 0;
a[i][column] = 1;
eightQueen(i + 1, a, n);
}
}
}
}
//用一维数组来解决8后问题,下标代表行数,下标上的值代表列数
int Isright(int*a, int row) {
for (int i = 0; i < row; i++) {
if (a[row] == a[i] || abs(a[row] - a[i]) == row - i)
return 0;
}
return 1;
}
void eightQueen2(int*a,int row,int n) {
static int cnt2 = 1;
if (row == n) {
printf("第%d次%d后问题为:\n",cnt2++,n);
for (int i = 0; i < n; i++) {
if (i == n - 1)printf("%d\n", a[i]);
else printf("%d ", a[i]);
}
}
else {
for (int j = 0; j < n; j++) {
a[row] = j;
if (Isright(a,row))
eightQueen2(a, row + 1, n);
}
}
}
int main() {
int a[10][10] = { 0 };
int a2[10] = { 0 };
int row;
printf("输入你要求的N后问题:");
scanf("%d", &row);
eightQueen(0, a, row);
//eightQueen2(a2, 0, row);
return 0;
}