算法入门(二) 递归2
1.n皇后问题
题目分析:因为有n个皇后,不可能用n重循环来一次一次判断是否能满足不互相攻击,所以采用递归来替代多重循环。
#include<iostream>
#include<cmath>
using namespace std;
int n;
int queenpos[100];
void nqueen(int k)
{
int i,j;
if(k==n) //若n个皇后已经摆好啦
{
for(i=0;i<n;i++)
cout<<queenpos[i]+1<<" ";
cout<<endl;
return ;
}
for(i=0;i<n;i++) //一个一个尝试第k个皇后的位置
{
for(j=0;j<k;j++)
{
if(queenpos[j]==i||abs(queenpos[j]-i)==abs(k-j))
break;//和已经摆好的k个皇后比,横竖不能一排一列,斜着也不行
}
if(j==k) //如果和之前的不冲突
{
queenpos[k]=i;
nqueen(k+1); //继续摆下一个皇后
}
}
}
int main()
{
cin>>n;
nqueen(0); //从第0行开始摆
return 0;
}
2.逆波兰表达式
分析:
- 一个数是一个逆波兰表达式,值为该数
- “运算符 逆波兰表达式 逆波兰表达式” 是逆波兰表达式 ,值为两个逆波兰表达式的值运算的结果
代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
double exp()
{
char s[20];
cin>>s;
switch(s[0])
{
case '+': return exp()+exp();
case '-': return exp()-exp();
case '*': return exp()*exp();
case '/': return exp()/exp();
default: return atof(s);
break;
}
}
int main()
{
printf("%lf",exp());
return 0;
}