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


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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值