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<bits/stdc++.h>
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;
}
收获:想要按照字典序排序时,可以在输入的时候就预排序,这样就可以直接用了