c:遞歸算法的三個demo:八皇后問題、臺階問題、漢諾塔

一:八皇后問題c++

        一個8*8的棋盤中放有8個皇后,每兩個皇后不能處在同一行同一列同一斜線中
app

(在我用vc++測試時只出來52種結果,但別人用個人代碼測出來了全部答案,我懷疑是函數棧不夠的緣由,還請大神指點)函數

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
typedef struct Arr{
    int len;
    int cnt;
    int * pBase;
}ARR,* PARR;
void init_arr(PARR pArr,int val){//初始化
    pArr->pBase=(int *)malloc(sizeof(int)*val);
    if(NULL==pArr->pBase){
        printf("內存不足");
        exit(-1);
    }
    pArr->cnt=0;
    pArr->len=val;
}
bool is_full(PARR pArr){//判滿
    if(pArr->cnt==pArr->len){
        return true;
    }else{
        return false;
    }
}
bool is_empty(PARR pArr){//判空
    if(pArr->cnt==0){
        return true;
    }else{
        return false;
    }
}
bool append_arr(PARR pArr,int val){//追加
    if(is_full(pArr)){
        printf("已滿");
        return false;
    }else{
        pArr->pBase[pArr->cnt]=val;
        pArr->cnt=pArr->cnt+1;
        return true;
    }
}


void show_arr(PARR pArr){//遍歷
    for(int i=0;i<pArr->cnt;i++){
        printf("%d    ",pArr->pBase[i]);
    }
    printf("\n");
}
bool check(PARR pArr,int y){
    for(int i=0;i<pArr->cnt;i++){
        if(pArr->pBase[i]==y||abs(pArr->pBase[i]-y)==abs(pArr->cnt-i)){
            return false;
        } 
    }
    return true;
}
int pop(PARR pArr){//回溯
    pArr->cnt=pArr->cnt-1;
    return pArr->pBase[pArr->cnt];
}
void f(PARR pArr,int y,int z){//y表明要插入的值,z表明結果個數
    int x=pArr->cnt+1;
    if(x==1&&y<9){
        append_arr(pArr,y);
        f(pArr,1,z);
    }else if(x==1&&y==9){
        printf("結束");
    }else if(x>1&&x<9&&y<9){
        if(check(pArr,y)){
            append_arr(pArr,y);
            f(pArr,1,z);
        }else{
            f(pArr,y+1,z);
        }
    }else if(x>1&&x<9&&y==9){
        int val=pop(pArr);
        f(pArr,val+1,z);
    }else if(x==9){
        z++;
        show_arr(pArr);
        printf("結果個數:%d\n",z);
        int temp=pop(pArr);
        f(pArr,temp+1,z);
    }
}
int main(void){
    ARR arr;
    init_arr(&arr,8);
    f(&arr,1,0);
    return 0;

}

二:臺階問題
        一我的每次能夠走一、二、3個臺階,共有5個臺階,求可能狀況
(index--老是忘,要保證明現一種狀況後進行第二種狀況的時候各項參數都是正確的)
    測試

#include <stdio.h>
#define STAIR_NUM 5
int index=0;
int list[STAIR_NUM];
void show(){
    for(int i=0;i<index;i++){
        printf("-%d",list[i]);
    }
    printf("\n");
}
void f(int n){
    if(n==0){
        for(int i=0;i<index;i++){
            printf("%d_",list[i]);
        }
        printf("\n");
    }
    if(n>=1){
        list[index]=1;
        index++;
        f(n-1);
        index--;
    }
    if(n>=2){
        list[index]=2;
        index++;
        f(n-2);
        index--;
    }
    if(n>=3){        
        list[index]=3;
        index++;
        f(n-3);
        index--;
    }
}
int main(void){
    f(5);
    return 0;
}

三:  漢諾塔code

    #include <stdio.h>
    #include <malloc.h>
    #include <stdlib.h>

    void f(int n,char x,char y,char z){
        
        if(n==1){
            printf("將編號爲1的盤子從%c柱子移到%c\n",x,z);
        }else{
            f(n-1,x,z,y);
            printf("將編號爲%d的盤子從%c柱子移到%c\n",n,x,z);
            f(n-1,y,z,x);
        }
    }
    int main(voi
d){
        char ch1='A';
        char ch2='B';
        char ch3='C';
        int n;
        printf("請輸入盤子個數:");
        scanf("%d",&n);
        f(n,'A','B','C');
        return 0;
    }
相關文章
相關標籤/搜索