蓝桥杯--枚举法

枚举法,就是把所有的情况都写出来,然后和所需要的结果进行比对。

简单枚举法:
例题:众所周知在扑克牌中,有一个老掉牙的游戏叫做24点,选取4张牌进行加减乘除,看是否能得出24这个答案。

现在小蓝同学发明了一个新游戏,他从扑克牌中依次抽出6张牌,注意不是一次抽出,进行计算,看是否能够组成 42 点,满足输出YES,反之输出 NO。

最先抽出来的牌作为第一个操作数,抽出牌做第二个操作数,运算结果在当作第一个操作数,继续进行操作。

除不尽的情况保留整数。

请设计一个程序对该问题进行解答。
输入:

K A Q 6 2 3

输出:

YES

words are cheap,show me code

#include
using namespace std;

int a[10];                    //存数字
vector<int>ans[10];               //开向量,存每次加减乘除后的结果


int main()
{
	int i, j;
	for (i = 0; i < 6; i++)       //存数字
	{
		char c;
		cin >> c;
		if (c == 'A')
			a[i] = 1;
		else if (c == 'J')
			a[i] = 11;
		else if (c == 'Q')
			a[i] = 12;
		else if (c == 'K')
			a[i] = 13;
		else a[i] = c - '0';
	}
	ans[0].push_back(a[0]);    //把第一个元素放在向量里面,作为第一个运算的元素

	for(i=1;i<6;i++)
		for (j = 0; j < ans[i-1].size(); j++)   //下一个元素和上一个元素进行四仄圆算,并且结果放在vector里面
		{
			ans[i].push_back(ans[i - 1][j] + a[i]);
			ans[i].push_back(ans[i - 1][j] - a[i]);
			ans[i].push_back(ans[i - 1][j] * a[i]);
			ans[i].push_back(ans[i - 1][j] / a[i]);
		}

	for (i = 0; i < ans[5].size(); i++)   //第6次运算的各个结果与所需要的数值进行比对
	{
		if (ans[5][i] == 42)
		{
			cout << "yes" << endl;
			return 0;
		}
	}
	cout << "NO" << endl;
	return 0;

}

另外还有一个全排列的枚举法:

#include
using namespace std;

bool choose[20];
int order[20];
int n;
string ans[10];

void calc(int k)
{
	if (k == n + 1)
	{
		for (int i = 1; i <= n; i++)
		{
			cout << ans[order[i]-1]<<" ";
		}
		cout << endl;
		return;
	}

	for (int i = 1; i < n + 1; i++)
	{
		if (choose[i])
			continue;

		order[k] = i;  //第k个数
		choose[i] = 1; //对数字i进行标记
		calc(k+ 1);     //进行第k+1个数的选取
		order[k] = 0;   //
		choose[i] = 0;
	}

}

int main()
{
	
	cin >> n;
	for (int i = 0; i < n; i++)
		cin >> ans[i];
	calc(1);


}

你可能感兴趣的:(蓝桥杯,c++,算法)