题目
- 大意:
知识点
- DFS
- Map判重
思路
- 总共状态不多,而且是选择题,直接用vector记录状态+map判重即可
- canuse记录可以选择的数字
- 原本想用unordered_map和unordered_set,忘记vector没有对应哈希函数
- 答案:80
代码
# include <iostream>
# include <vector>
# include <algorithm>
# include <set>
# include <map>
using namespace std;
int res = 0;
map<int, vector<int>> m;
set<vector<int>> vis;
// a b c d e f g
// 0 1 2 3 4 5 6
void init() { // 生成图
m[0] = {1, 5};
m[1] = {0, 2, 6};
m[2] = {1, 3, 6};
m[3] = {2, 4};
m[4] = {3, 5, 6};
m[5] = {0, 4, 6};
m[6] = {1, 2, 4, 5};
}
void dfs(int index, vector<int> status, bool canuse[]) {
vector<int> temp = status;
sort(temp.begin(), temp.end());
if (!vis.count(temp)) { // 判重
res++;
vis.emplace(temp);
for (int i:status) { // 输出结果
cout << i << " ";
}
cout << endl;
}
for (int i:m[index]) {
if (canuse[i]) { // 如果可以使用
canuse[i] = false;
status.push_back(i);
dfs(i, status, canuse);
status.pop_back(); // 记得恢复状态
canuse[i] = true;
}
}
}
int main() {
init();
for (int i = 0; i < 7; i++) { // DFS遍历
bool t[7];
memset(t, true, sizeof(bool[7]));
t[i] = false;
vector<int> t1;
t1.push_back(i);
dfs(i, t1, t);
}
cout << res << endl;
return 0;
}
过程中遇到的问题 & 解决
- 一开始写的时候忘记记录用过的位置了,导致程序死循环,笨笨的…
测试
结果:✔️
80