枚举法,就是把所有的情况都写出来,然后和所需要的结果进行比对。
简单枚举法:
例题:众所周知在扑克牌中,有一个老掉牙的游戏叫做24点,选取4张牌进行加减乘除,看是否能得出24这个答案。
现在小蓝同学发明了一个新游戏,他从扑克牌中依次抽出6张牌,注意不是一次抽出,进行计算,看是否能够组成 42 点,满足输出YES,反之输出 NO。
最先抽出来的牌作为第一个操作数,抽出牌做第二个操作数,运算结果在当作第一个操作数,继续进行操作。
除不尽的情况保留整数。
请设计一个程序对该问题进行解答。
输入:
K A Q 6 2 3
输出:
YES
words are cheap,show me code
#include<bits/stdc++.h>
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<bits/stdc++.h>
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);
}