#include<iostream>#include<vector>#include<string.h>usingnamespace std;intF(int a){//递归结束条件if(a ==0|| a ==1)return1;//递归表达式returnF(a -1)+F(a -2);}intmain(){//求斐波那契数列int a =0;scanf("%d",&a);int ans =F(a);
cout << ans;system("pause");return0;}
求全排列(分治)
#include<iostream>#include<string.h>usingnamespace std;constint MAXN =11;//P记录当前排列, HashTable记录数字是否被使用过int n, P[MAXN], hashTable[MAXN]={false};voidgenerateP(int idx){//递归结束条件,如果下标为n+1,代表已经输出了n个字符,直接输出if(idx == n +1){for(int i =1; i <= n; i ++){printf("%d ", P[i]);//输出数组}
cout << endl;return;}//递归表达式for(int x =1; x <= n; x++){//如果当前数字并没有被用过if(hashTable[x]==false){
P[idx]= x;
hashTable[x]=true;generateP(idx +1);//递归去处理下一位的子问题
hashTable[x]=false;//当已经解决这个子问题后,会产生回溯,要把当前位的数字换成别的数字}}}intmain(){//求全排列scanf("%d",&n);generateP(1);system("pause");return0;}
#include<iostream>#include<string.h>usingnamespace std;constint MAXN =11;//P记录当前列上皇后所在的行, HashTable记录数字是否被使用过int n, P[MAXN], hashTable[MAXN]={false};int cnt =0;voidgenerateP(int idx){//递归结束条件,如果下标为n+1,代表已经输出了n个字符,直接输出if(idx == n +1){bool flag =true;for(int i =1; i <= n; i ++){for(int j = i +1; j <= n; j++){if(abs(j - i)==abs(P[j]- P[i]))return;//代表在一条对角线上}}if(flag){
cnt ++;for(int i =0; i < n; i++)printf("%d ", P[i]);
cout << endl;}return;}//递归表达式for(int x =1; x <= n; x++){//如果当前数字并没有被用过if(hashTable[x]==false){
P[idx]= x;
hashTable[x]=true;generateP(idx +1);//递归去处理下一位的子问题
hashTable[x]=false;//当已经解决这个子问题后,会产生回溯,要把当前位的数字换成别的数字}}}intmain(){//求全排列scanf("%d",&n);generateP(1);
cout << cnt ;system("pause");return0;}
八皇后问题(回溯算法)
回溯:递归的过程中如果出现某一情况已经不满足题意,无需再次递归到边界问题时,称为回溯
#include<iostream>#include<string.h>usingnamespace std;constint MAXN =11;//P记录当前列上皇后所在的行, HashTable记录数字是否被使用过int n, P[MAXN], hashTable[MAXN]={false};int cnt =0;voidgenerateP(int idx){//递归结束条件,如果下标为n+1,那么这个结果一定是合理的if(idx == n +1){
cnt ++;for(int i =1; i <= n; i ++){printf("%d ", P[i]);}printf("\n");return;}//递归表达式for(int x =1; x <= n; x++){//如果当前行并没有皇后,则进行检查if(hashTable[x]==false){bool flag =true;//记录会不会跟之前的皇后冲突for(int pre =1; pre < idx; pre ++){if(abs(idx - pre)==abs(x - P[pre])){
flag =false;//如果发现当前皇后与前面某一皇后冲突,则break,这种方法叫做回溯break;}}//如果flag为true,代表没有冲突,继续往下递归if(flag){
P[idx]= x;
hashTable[x]=true;generateP(idx +1);//递归去处理下一位的子问题
hashTable[x]=false;//当已经解决这个子问题后,会产生回溯,要把当前位的数字换成别的数字}}}}intmain(){//求全排列scanf("%d",&n);generateP(1);
cout << cnt ;system("pause");return0;}