算法入门(二) 递归2

算法入门(二) 递归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.逆波兰表达式

在这里插入图片描述
在这里插入图片描述
分析:

  1. 一个数是一个逆波兰表达式,值为该数
  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;
}

发布了10 篇原创文章 · 获赞 7 · 访问量 338

猜你喜欢

转载自blog.csdn.net/weixin_44026026/article/details/103058508