题目: 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("\n");
    }
    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\n", 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;
}
简洁写法

 

posted on 2015-09-15 22:56  cleverbiger  阅读(180)  评论(0)    收藏  举报