递归---案例(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;}
逆波兰表达式:
可直接用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,1和1,5,1是同一种分法。
输入
第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。
输出
对输入的每组数据M和N,用一行输出相应的K。
样例输入
1
7 3
样例输出8
#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;}
汉诺塔问题
古代有一个梵塔,塔内有三个座A、B、C,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
- 递归---案例(n皇后问题,逆波兰表达式,)
- 递归 N皇后问题 逆波兰表达式
- 刷题打卡 7 简单汉诺塔问题,N皇后问题,逆波兰表达式
- 逆波兰表达式(递归)
- (递归)逆波兰表达式
- N皇后问题(递归)
- 逆波兰表达式 递归
- 逆波兰表达式递归
- n皇后问题【递归】
- 递归 N皇后问题
- N皇后问题 (递归)
- 递归---n皇后问题
- poj 2694 逆波兰表达式(递归)
- N皇后问题(递归法)
- N皇后问题(回溯递归)
- HDOJ 2553 N皇后问题(递归)
- caioj1035:递归5( n皇后问题)
- 八皇后问题(可改为N皇后)递归
- Linux(ubuntu)虚拟内存的设置(转)
- 游戏,角色,及属性方法总结
- erlang使用\
- 学习erlang之后的一个想法
- 简易session购物车开发
- 递归---案例(n皇后问题,逆波兰表达式,)
- erlang项目常见OTP行为模式
- 设计模式--命令模式
- Objective-C的Http请求(转)
- 不使用cocos2d库从texturepacker打包资源得到UIImage
- UIImage类中的常用拉伸方法(转)
- iOS下使用md5码(转)
- mac os系统下搭建cocos2d-x的android开发环境(整理)
- MySQL组合查询(转)