递归 N皇后问题 逆波兰表达式
2017-03-05 14:51
309 查看
N皇后问题
1 问题描述在n×n格的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于再n×n的棋盘上放置n个皇后,任何2个皇后不妨在同一行或同一列或同一斜线上。要求输出所有的放置方法。
2 问题分析
这里用递归求解,思路很简单,即从第0行开始,遍历判断每个能够放置皇后的位置,然后在确定前k行的情况下,进行第k+1行的判断,最后输出结果。
3 完整代码
#include<iostream>
#include<cmath>
using namespace std;
int queen[100];
int n; //共有n个皇后
//queen[i]表示在第i行有一个皇后,其数值表示该皇后所在列
//这样设置数组即保证了每个皇后都在不同行,这里我们应用递归求解
void queenList(int k)//这里的k表示在k-1行都摆好皇后的前提下,第k个皇后的摆法
{
if(k == n)//全部摆好,只需输出即可
{
for(int i = 0; i < n; i++)
cout << queen[i] + 1 << ' ';
cout << endl;
}
else
{
//遍历每一列,看看是否能够摆放皇后,因为可能不止一组解,所以我们需要将整个列遍历完全
for(int i = 0; i < n; i++)
{
//如果该位置所在列或者斜边已经有皇后,则说明该位置不能摆放皇后
int j(0);
for(; j < k; j++)
{
//对于斜边上的判断,我们只需要看行行相减与列列相减的绝对值是否相等
if((queen[j] == i) || (abs(i - queen[j]) == abs(k - j)))
break;
}
if(j == k)
{
queen[k] = i;
queenList(k + 1);
}
}
}
}
int main()
{
cin >> n;
queenList(0);
return 0;
}
逆波兰表达式
也称为后缀表达式,即把运算符提前输入为1行,表达式中运算符和运算数之间用空格隔开。输出表达式的值。
#include<iostream>
#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()
{
cout << exp() << endl;
return 0;
}
相关文章推荐
- 递归---案例(n皇后问题,逆波兰表达式,)
- 递归-八皇后/N皇后问题
- 通过8皇后问题浅析回溯法的递归实现
- n皇后问题java递归实现
- n皇后问题【递归】
- n皇后问题【非递归回溯】
- 关于n皇后问题的递归求解,有详细的步骤说明。
- 回溯法解决N皇后问题——递归与非递归求解
- N皇后问题(递归回溯的学习)
- N皇后问题递归和非递归效率测试
- C++递归问题之二——n皇后问题:以四、八皇后为例,给定n个皇后要求将它们放在一个n维矩阵中,任意两个皇后不能出现在同一行、列、主副对角线上,输出具体的摆放方式
- 8皇后问题递归求解
- 递归实现逆波兰式到正常表达式的转换
- 递归求解8皇后问题
- 深度优先—递归方法 求解n皇后问题
- 递归求解N皇后问题(c语言)
- 关于正则表达式的递归匹配问题
- 递归-回溯法求解8皇后问题(C)
- 树的递归回溯 n皇后问题
- hdu 2553 N皇后问题 (简单版_递归)