题目链接: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,
黄金分割数 。
正五边形 所组成的
正多面体 。 若以正十二面体的中心为(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; }