题意: 一个规则的实心十二面体,它的 20个顶点标出世界著名的20个城市,你从一个城市出发经过每个城市刚好一次后回到出发的城市。
Input
前20行的第i行有3个数,表示与第i个城市相邻的3个城市.第20行以后每行有1个数m,m<=20,m>=1.m=0退出.
Output
输出从第m个城市出发经过每个城市1次又回到m的所有路线,如有多条路线,按字典序输出,每行1条路线.每行首先输出是第几条路线.然后个一个: 后列出经过的城市.
思路:
这一题是很基本的dfs和回溯,
模板
void DFS(int step){
//判断边界
if(condition){
//do something
return ;回到上一步
}else{
//边界之内 遍历每一种情况
for(int i=1;i<=n;i++){
//标记判断
if(flag==false){
//do something
//打标记
flag==true;
DFS(step+1); 继续下一步
//取消标记
flag==false;
}
}
return ; //遍历完成 回到上一步
}
}
此题代码
#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
#include <vector>
using namespace std;
vector <int> mp[22];
vector <int> ans;
int bl[22];
int l;
int cnt;
void put(){
printf("%d: ",cnt++);
for(int i=0;i<20;i++){
printf(" %d",ans[i]);
}
printf(" %d\n",l);
return ;
}
void dfs(int a){
if(ans.size()==20){
for(int i=0;i<3;i++){
if(mp[a][i]==l)
put();
}
}
else{
for(int i=0;i<3;i++){
if(!bl[mp[a][i]]){
bl[mp[a][i]]=1;
ans.push_back(mp[a][i]);
dfs(mp[a][i]);
ans.pop_back();
bl[mp[a][i]]=0;
}
}
}
}
int main()
{
int a;
for(int i=1;i<=20;i++){
for(int j=0;j<3;j++){
cin>>a;
mp[i].push_back(a);
}
// sort(mp[i].begin(),mp[i].end());
}
while(cin>>a&&a){
l=a;
cnt=1;
ans.push_back(a);
bl[a]=1;
dfs(a);
bl[a]=0;
ans.pop_back();
}
}