递归---案例(n皇后问题,逆波兰表达式,)

来源:互联网 发布:中世纪优化9圣物 编辑:程序博客网 时间:2024/06/05 05:05

n皇后问题:

输入整数n,要求n个国际象棋的皇后,摆在n*n的棋盘上,互相不能攻击,输出全部方案。

输入一个正整数N,则程序输出N皇后问题的全部摆法。

输出结果里的每一行都代表一种摆法。行里的第i个数字如果是n,就代表第i行的皇后应该放在第n列。

皇后的行、列编号都是从1开始算。

样例输入:

4

样例输出:

2 4 13
3 1 4 2 


#include<iostream>#include <cmath>using namespace std;//n 皇后问题int result[100];int Num;//表示棋盘的大小;void nQueue(int N){    if(N == Num){//如果开始摆放第n个皇后,就将其输出所有的情况,递归结束;        for(int i = 0;i<Num;i++){            cout <<result[i]+1<<" ";        }        cout <<endl;        return ;    }    for(int i  = 0;i<Num;i++){//讨论第N行的每一个位置;可能是有多种情况的储存方式;        int j;        for(j = 0;j<N;j++){//已经储存好的N个皇后的位置(result[j]表示第j行的存放位置;)            if(result[j]==i||abs(result[j]-i)==abs(N-j))                break;//冲突,则试下一个位置        }        if(j == N)//表示和前面的已经储存位置没有冲突的;            {            result[N] = i;//表示第i 个位置可以存放这个位置;            nQueue(N+1);            }    }}int main(){        while(cin>>Num&&Num!=0){    nQueue(0);//从第0行开始摆放;    }    return 0;}

逆波兰表达式:

描述
逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3。逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的逆波兰表示法为* + 2 3 4。本题求解逆波兰表达式的值,其中运算符包括+ - * /四个。
输入
输入为一行,其中运算符和运算数之间都用空格分隔,运算数是浮点数。
输出
输出为一行,表达式的值。
可直接用printf("%f\n", v)输出表达式的值v。
样例输入
* + 11.0 12.0 + 24.0 35.0
样例输出
1357.000000



#include<iostream>#include <cstdlib>#include <cctype>using namespace std;//逆波兰表达式//   用递归解决递归形式的问题double ni_bo_nan(){    char s[50];    cin >> s;//不断地从缓冲区获取值字符串;    switch(s[0]){        case '+':return ni_bo_nan()+ni_bo_nan();        case '-':return ni_bo_nan()-ni_bo_nan();        case '*':return ni_bo_nan()*ni_bo_nan();        case '/':return ni_bo_nan()/ni_bo_nan();        default: return atof(s);//遇到数字字符就将其装换为数字类型;    }}int main10(){    cout << ni_bo_nan()<<endl;    return 0;}

爬楼梯:

 爬楼梯树老师爬楼梯,他可以每次走1级或者2级,输入楼梯的级数,求不同的走法数

例如:楼梯一共有3级,他可以每次都走一级,或者第一次走一级,第二次走两级,也可

以第一次走两级,第二次走一级,一共
3种方法。

输入

输入包含若干行,每行包含一个正整数N,代表楼梯级数,1 <=N <= 30输出不同的走法数,每一行输入对应一行

爬楼梯

输出

不同的走法数,每一行输入对应一行输出

样例输入

5
8
10

样例输出

8

34

89

   #include <iostream> using namespace std; //爬楼梯:int N1;int stairs(int n){    if( n < 0)        return 0;    if( n == 0 )        return 1;    return stairs(n-1) + stairs(n-2);}int main(){    while(cin >> N1) {        cout << stairs(N1) << endl;    }    return 0;}


放苹果

M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?5,1,11,5,1是同一种分法。
输入

第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整数MN,以空格分开。1<=M,N<=10
输出

对输入的每组数据MN,用一行输出相应的K

样例输入

1
7 3

样例输出

#include<iostream>using namespace std;int take_apple(int i,int k)//i苹果,k盘子{    if(k>i)//如果盘子的数目比苹果的多,就将多余的盘子除开,进行计算;        return take_apple(i, i);    if(i ==0)        return 1;    if(k<=0)        return 0;        return take_apple(i-k, k)+take_apple(i, k-1);}int main(){    cout <<take_apple(7, 3)<<endl;    return 0;}

汉诺塔问题

古代有一个梵塔,塔内有三个座ABC,A座上有64个盘子,盘子大小不等,大的在下,小的在上(如图)。有一个和尚想把这64个盘子从A座移到C座,但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在上。在移动过程中可以利用B座,要求输出移动

的步骤


#include<iostream>using namespace std;   //汉诺塔问题void han(int n,char A,char B,char C){    if(n == 1)        {cout <<A<<"->"<<C<<endl;return ;}    han(n-1,A,C,B);    cout <<A<<"->"<<C<<endl;    han(n-1,B,C,A);    return;}/* 1.判断边界条件: 如果盘子个数是1,直接将盘子移动到C塔上 如果不是: 2.将n-1个盘子借助C移动到B,然后再将剩下一个盘子移动到C塔上; 3.再将B上的n-1个盘子借助C移动到A,恢复原来的模样; 4.再循环这个操作即可; */int main(){    char A = 'A',B =  'B',C = 'C';    han(3, A, B, C);    return 0;}


原创粉丝点击