![HDU - 2181 dfs [kuangbin带你飞]专题二 HDU - 2181 dfs [kuangbin带你飞]专题二](https://image.shishitao.com:8440/aHR0cHM6Ly9ia3FzaW1nLmlrYWZhbi5jb20vdXBsb2FkL2NoYXRncHQtcy5wbmc%2FIQ%3D%3D.png?!?w=700&webp=1)
保存每个节点的下一个节点一直往下面走就行了,不能重复经过某个点,当经过的点达到20个而且当前节点的下一个节点是起点就打印答案。
AC代码
#include<cstdio> #include<vector> #include<cstring> #include<algorithm> using namespace std; const int maxn = 25; int vis[maxn]; vector<int>v[25]; int ans[maxn], num, m; void print() { printf("%d: ", num); for(int i = 0; i < 20; ++i) printf(" %d", ans[i]); printf(" %d\n", m); } void dfs(int u, int cnt) { ans[cnt] = u; if(cnt == 19) { int flag = 0; for(int i = 0; i < 3; ++i){ if(v[u][i] == m) flag = 1; } if(flag) { num++; print(); } return; } if(cnt >= 20) return; vis[u] = 1; for(int i = 0; i < 3; ++i) { if(vis[v[u][i]]) continue; dfs(v[u][i], cnt + 1); } vis[u] = 0; } int main(){ int a[3]; for(int i = 1; i <= 20; ++i) { v[i].clear(); for(int j = 0; j < 3; ++j){ scanf("%d", &a[j]); v[i].push_back(a[j]); } sort(v[i].begin(), v[i].end()); //确保字典序最小 } while(scanf("%d", &m) == 1 && m) { memset(vis, 0, sizeof(vis)); num = 0; dfs(m, 0); } return 0; }
如有不当之处欢迎指出!