这次比赛好多签到题,可惜我前晚喝了点伏特加,思维迟钝,搞了半天拿了个4题尾,成功打铁。后面的题看都没看,也不会做,只有写写签到题题解才能维持了生活这样子。
这道签到题题意大概是输入六个字符串,从每个字符串拿一个字符,看能不能组成"harbin"。那就用先存下六个字符串各出现的字符,然后对每个字符串的’h’, ‘a’, ‘r’, ‘b’, ‘i’, 'n’进行暴力dfs,看能不能拼成"harbin"即可。
#include <iostream>
#include <string>
#include <map>
using namespace std;
bool finded;
const int harbin[] = { 'h', 'a', 'r', 'b', 'i', 'n' };
void dfs(map<char, int>(&mp)[6], map<char, int>& target, int len);
int main(void)
{
int t;
cin >> t;
while (t--)
{
map<char, int> mp[6];
for (int i = 0; i < 6; ++i)
{
string str;
cin >> str;
for (const auto& ch : str)
{
++mp[i][ch];
}
}
finded = false;
map<char, int> target;
dfs(mp, target, 0);
cout << (finded ? "Yes" : "No") << endl;
}
}
void dfs(map<char, int> (&mp)[6], map<char, int>& target, int len)
{
if (len == 6)
{
finded = true;
return;
}
else
{
for (int i = 0; i < 6; ++i)
{
if (mp[len][harbin[i]] && !target[harbin[i]])
{
++target[harbin[i]];
dfs(mp, target, len + 1);
--target[harbin[i]];
if (finded)
{
return;
}
}
}
}
}