题目: http://acm.hdu.edu.cn/showproblem.php?pid=2181
好像很久没有刷题了, 真的是手生到不要不要的, 这道应该很明显就是Dfs, 然而我第一眼看上去竟然没有什么感觉, 还是看题解解出来的。 看来以后每天要至少A道题保持手感了。
//这个比较好理解, 算是一种比较常规的写法了; #include <cstdio> #include <cstring> #include <iostream> using namespace std; int map[21][21], dis[21], vis[21], ge, num, m, Q; void Dfs(int x) { int k; dis[num++] = x; //标记开始节点; vis[x] = 1; if(num == 20 && map[x][m]) //回到开始城市; { printf("%d: ", ++Q); for(int i = 0; i < 20; i++) printf("%d ", dis[i]); printf("%d", m); printf(" "); } for(int k = 1; k <= 20; k++) { if(!vis[k] && map[x][k]) { Dfs(k); vis[k] = 0; num--; } }
} int main() { int a, b, c, i, j, t; for(int i = 1; i <= 20; i++) { for(int j = 1; j <= 3; j++) { scanf("%d", &t); map[i][t] = 1; } } while(~scanf("%d", &m), m) { Q = 0; num = 0; memset(vis, 0, sizeof(vis)); memset(dis, 0, sizeof(dis)); Dfs(m); } return 0; }
#include <cstdio> #include <cstring> #include <iostream> using namespace std; int map[21][3], dis[21], vis[21], Q; void Dfs(int a, int n, int A) { dis[n] = a; vis[a] = 1; int i, j; for(int i = 0; i < 3; i++) { int s = map[a][i]; if(n == 19 && s == A) { printf("%d: ", ++Q); for(int j = 0; j < 20; j++) printf("%d ", dis[j]); printf("%d ", A); } if(!vis[s]) Dfs(s, n + 1, A); } vis[a] = 0; } int main() { for(int i = 1; i <= 20; i++) scanf("%d %d %d", &map[i][0], &map[i][1], &map[i][2]); int M; while(~scanf("%d", &M), M) { Q = 0; memset(vis, 0, sizeof(vis)); Dfs(M, 0, M); } return 0; }