8皇后 可以用递归和非递归的方法,两年前用非递归试过没做出来。当时也看过别人用递归求的。现在完全想不起来了。前几天看来数据结构,只看思路,试了几个经典的递归问题,汉诺塔没做出来,全排列没做出来,8皇后也没做出来。今天用递归花几个小时重做了一下8皇后,做出来了,还是比较吃力。。。主要困惑在于什么条件下需要下一次递归,递归什么时候结束,递归结束返回上层的时候需要其他处理吗。从进到下一次递归到查找到最后逐层返回到最上层,想了好多遍。。。终于没有这个心结了。应该还能优化吧,以前看过matrix67笔记说有很快的方法,改天看别人怎么优化的,试一试非递归。可以改成n皇后
8皇后:
int a[9] = { 0 };
int total;
void show(int a[], int n) {
int i = 0;
for (i = n; i > 0; i--) {
printf("%d ", a[i]);
}
printf(" ");
if(total%4==0)
putchar('\n');
}
int check_valid(int n, int pos) {
int i;
if (n == 8) return 1;
for (i = 8; i > n; i--) {
if (a[i] == pos || n + a[i] - i == pos || -n + a[i] + i == pos) return 0;
}
return 1;
}
void Q(int n) {
int i ;
int flag ;
for (i = 1; i <= 8; i++) {
a[n] = i;
flag = check_valid(n, i);
if (flag) {
if (n == 1) { total++; show(a, 8); return; }
else Q(n - 1);
}
else continue;
}
return;
}
int main()
{
Q(8);
printf("%d\n", total);
return 0;
}
n皇后
int a[1200] = { 0 };
int total;
void show(int a[], int n) {
int i = 0;
for (i = n; i > 0; i--) {
printf("%d ", a[i]);
}
putchar('\n');
}
int check_valid(int rank,int n, int pos) {
int i = 0;
if (n == rank) return 1;
for (i = rank; i > n; i--) {
if (a[i] == pos || n + a[i] - i == pos || -n + a[i] + i == pos) return 0;
}
return 1;
}
void Q(int n,int rank) {
int i = 0;
int flag = 0;
for (i = 1; i <= rank; i++) {
a[n] = i;
flag = check_valid(rank,n, i);
if (flag) {
if (n == 1) { total++; show(a, rank); return; }
else Q(n - 1,rank);
}
else continue;
}
return;
}
int main()
{
Q(12,12);
printf("%d\n", total);
return 0;
}