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