本文主要是介绍uva208,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
//兴高采烈的敲完了回溯代码,哈哈哈!!!
//什么?我不相信,我明明回溯了,为什么会超时呢?为什么,提交了两次都超时了
//果然还是做了无用功!!其实重要的原因还是把不能到达目的地的点也递归了!!!其实只要先初始化一下,从后面开始标志可以到达目的地的点,然后在开始递归就可以了
#include <stdio.h>
#include <string.h>
int a[30][30],b[30];
int n,m,num,vis[30],can[30];
void init(int x)
{int i;for(i=2;i<=m;i++)if(a[x][i]&&!can[i]){can[i]=1;init(i);}
}
void dfs(int x,int cur)
{int i;if(x==n){for(i=0;i<cur;i++){if(i!=0)printf(" ");printf("%d",b[i]);}printf("\n");num++;return ;}for(i=2;i<=m;i++)if(a[x][i]&&!vis[i]&&can[i]){vis[i]=1;b[cur]=i;dfs(i,cur+1);vis[i]=0;}
}
main()
{int u,v,count=1;//freopen("D:\\o.txt","r",stdin);while(scanf("%d",&n)!=EOF){memset(a,0,sizeof(a));memset(vis,0,sizeof(vis));memset(can,0,sizeof(can));while(1){scanf("%d%d",&u,&v);if(u==0&&v==0)break;if(u>m)m=u;if(v>m)m=v;a[u][v]=a[v][u]=1;}printf("CASE %d:\n",count++);b[0]=1;num=0;init(n);dfs(1,1);printf("There are %d routes from the firestation to streetcorner %d.\n",num,n);}return 0;
}
这篇关于uva208的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!