题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2181
此题真的是一个水题,当然也只有这种题目才给了我前进的动力,要是一直被各种打压,岂不得累死!
这个题只是求路径存在问题,所以正十二面体长啥样样我们并不关心,只要打印对于解就可以了。
下面是一些关于正十二面体的一些知识点:
这是正十二面体的样子:
,
展开图:
一些常用数据:
特征系列 5,0,5,5,5,5,5,0,5,5,0,5,0,5,0,5,0,5
正十二面体是由 12 个
正五边形 所组成的
正多面体 。 若以正十二面体的中心为(0,0,0),各顶点的坐标为{(0,±1/φ,±φ), (±1/φ,±φ,0), (±φ,0,±1/φ), (±1,±1,±1)},其中φ = (-1+√5)/2,
黄金分割数 。
体心到每个顶点的距离(外接球半径)=(√3+√15)/4×a
体心到每个面的中心的距离(
内切球半径)=(√(250+110√5))/20×a
体心到每条棱的中点的距离(切棱球
半径)=(√5+3)/4×a
这是代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int Map[22][22],vis[22],front[22],T;
void disp(int n,int ans){//打印解
if(front[n]==n){
printf("%d: %d",ans,n);
return;
}
disp(front[n],ans);
printf(" %d",n);
}
void dfs(int n,int count,int &ans){//count记录已经被遍历的点的个数,ans记录第几个情况
if(count==20){
if(Map[n][T]) {
disp(n,ans);
printf(" %d\n",T);//最后面的加上起始点
ans++;
}
return;
}
for(int i=1,j=1;i<=20 && j<4;i++){//按序号小的先遍历可以保证字典序最小
if(vis[i] || !Map[n][i]) continue;
vis[i]=1;
front[i]=n;
dfs(i,count+1,ans);
j++;//因为每个点有且只有三个点与其相连,当找到三个数后就结束循环
vis[i]=0;
}
}
int main(){
//freopen("C:\\Documents and Settings\\All Users\\桌面\\in.txt","r",stdin);
//freopen("C:\\Documents and Settings\\All Users\\桌面\\out2.txt","w",stdout);
int a,b,c;
while(cin>>a && a){
memset(Map,0,sizeof(Map));
memset(vis,0,sizeof(vis));
cin>>b>>c;
Map[1][a]=Map[1][b]=Map[1][c]=1;
for(int i=2;i<=20;i++){
cin>>a>>b>>c;
Map[i][a]=Map[i][b]=Map[i][c]=1;
Map[a][i]=Map[b][i]=Map[c][i]=1;
}
int k=1;
while(cin>>T && T){
vis[T]=1;
front[T]=T;
dfs(T,1,k);
vis[T]=0;
}
}
return 0;
}