题目大意:

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;
}