题目大意:
T组测试数据,每组输入6个字符串,每个字符串选出一个字母,问能否组成harbin字符串
思路:
- 方法一:处理出每个字符串存在的harbin字符子集,然后枚举子集,最差时间复杂度6^6,剪枝可去掉
- 方法二:枚举六个字符串的顺序,然后检测是否可以成功,时间复杂度6!,可剪枝一部分
对比一下选择方法二
#include <stdio.h>
#include <iostream>
#include <string>
#include <map>
using namespace std;
string s[10];
bool is_exist[10][10], vis[10];
const int n = 6;
int ans;
map<char, int> mp;
void init() {
memset(is_exist, 0, sizeof(is_exist));
for (int i = 0; i < n; i++) {
for (int j = 0; j < s[i].length(); j++) {
if (mp.count(s[i][j]) == 0) {
continue;
}
else {
is_exist[ i ][ mp[s[i][j]] ] = true;
}
}
}
/*for (int i = 0; i < n; i++) { for (int j = 0; j < 10; j++) { cout << " " << is_exist[i][j] << " "; } cout << endl; }*/
memset(vis, 0, sizeof(vis));
}
void dfs(int x) {
if (x == n || ans == 1) {
ans = 1;
return;
}
for (int i = 0; i < n; i++) {
if (vis[i] == true || is_exist[i][x + 1] == false) {
continue;
}
else {
vis[i] = true;
dfs(x + 1);
vis[i] = false;
}
}
}
int main() {
int T;
mp.clear(); mp['h'] = 1; mp['a'] = 2; mp['r'] = 3; mp['b'] = 4; mp['i'] = 5; mp['n'] = 6;
cin >> T;
while (T--) {
ans = 0;
for (int i = 0; i < n; i++) {
cin >> s[i];
}
init();
dfs(0);
if (ans == 0) {
cout << "No" << endl;
}
else {
cout << "Yes" << endl;
}
}
return 0;
}