您的位置:首页 > 其它

递归 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: