8皇后 n皇后 递归

来源:互联网 发布:java getclass 编辑:程序博客网 时间:2024/05/16 05:44

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;}


原创粉丝点击