一:八皇后問題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; }