HDU - 2181 :哈密顿绕行世界问题

Descriptions:

一个规则的实心十二面体,它的 20个顶点标出世界著名的20个城市,你从一个城市出发经过每个城市刚好一次后回到出发的城市。

Input

前20行的第i行有3个数,表示与第i个城市相邻的3个城市.第20行以后每行有1个数m,m<=20,m>=1.m=0退出.
Output

输出从第m个城市出发经过每个城市1次又回到m的所有路线,如有多条路线,按字典序输出,每行1条路线.每行首先输出是第几条路线.然后个一个: 后列出经过的城市.参看Sample output

注意格式:PA了一发,发现是少了加了一个空格

#include
using namespace std;
int g[25][5];//世界城市
int path[25];//答案数组
bool book[25];//标记是否使用过
int total;//有几种环游的个数
int m;
void dfs(int x,int sum) {//第几个城市,总共环游了几个城市
    for (int i = 0; i < 3; ++i) {
        //全部走完,并且下一个是起始城市
        if (sum == 19 && g[x][i] == m) {
            cout << total++ << ":  ";//输出格式
            for (int i = 0; i < 20; ++i)
                cout << path[i] << " ";
            cout << m << endl;
            return;
        }
        if (!book[g[x][i]]) {
            book[g[x][i]] = 1;
            path[sum + 1] = g[x][i];
            dfs(g[x][i], sum + 1);
            book[g[x][i]] = 0;
        }
    }
}
int main() {
    //freopen("in.txt", "r", stdin);
    int t[3];
    for (int i = 1; i <= 20; ++i) {
        cin >> t[0] >> t[1] >> t[2];
        //因为是按照字典顺序,所以这里先处理一下,从小到大排
        sort(t, t + 3);
        g[i][0] = t[0], g[i][1] = t[1], g[i][2] = t[2];
    }
    while (cin >> m && m) {
        total = 1;//环游世界的方案
        memset(book, false, sizeof book);
        book[m] = true;
        path[0] = m;//存入路径数组
        dfs(m, 0);
    }
    return 0;
}

收获:想要按照字典序排序时,可以在输入的时候就预排序,这样就可以直接用了

你可能感兴趣的:(HDU - 2181 :哈密顿绕行世界问题)