这道题的做法就是全排列+check(),全排列可以用next_permution(),至于chek()函数我们可以看题目要求:
我们可以利用两个数之间的距离是否为3 (两个2之间有2张牌)
两个位置的距离是否为4 (两个3之间有3张牌)
两个位置之间距离是否为5 (两个4之间有4张牌)
从而来判断是否满足条件。
我们可以check()一部分,另一部分用眼睛去看,如果结果数量太多那就把chek()写完整一点。
#include <bits/stdc++.h>
using namespace std;
bool check(string& s)
{
if (s.rfind('A') - s.find('A') == 2 &&
s.rfind('2') - s.find('2') == 3 &&
s.rfind('3') - s.find('3') == 4 &&
s.rfind('4') - s.find('4') == 5
)
return true;
return false;
}
int main()
{
cin.tie(nullptr)->sync_with_stdio(false);
string s = "223344AA"; //按字典序来 不然还要写排序
do
{
if (check(s))
cout << s << endl;
} while (next_permutation(s.begin(), s.end()));
return 0;
}
经过观察发现符合要求有两个答案,其中2342A3A4的字典序较小,即正确答案: