回溯,还是DFS()函数,递归。。。枚举每一种情况。第一WA是:不一定input中的第一个点就是连接端点,第二次加入FOR循环。一次判断每一个起点时,忘了给vis数组清零。
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
typedef struct point
{
int x,y;
} point;
point p[10];
int n,vis[10],temp[10],ans[10];
double min,mm;
double cmp(int i,int j)
{
return sqrt((p[i].y-p[j].y)*(p[i].y-p[j].y)+(p[i].x-p[j].x)*(p[i].x-p[j].x));
}
void dfs(int cur,int num)
{
temp[num]=cur;
vis[cur]=1;
if(num==n-1)
{
mm=0;
for(int i=0; i<n-1; i++)
mm+=cmp(temp[i],temp[i+1]);
if(mm<min)
{
for(int i=0; i<n; i++)
ans[i]=temp[i];
min=mm;
}
}
else for(int i=0; i<n; i++)
{
if(cur==i) continue;
if(!vis[i])
{
dfs(i,num+1);
vis[i]=0;
}
}
}
int main()
{
/*freopen("in.txt","r",stdin);*/
int cas=0;
while(scanf("%d",&n)!=EOF&&n!=0)
{
cas++;
for(int i=0; i<n; i++)
scanf("%d%d",&p[i].x,&p[i].y);
min=2147483647;
for(int i=0; i<n; i++)
{
memset(vis,0,sizeof(vis));
dfs(i,0);
}
double sum=0;
printf("**********************************************************\n");
printf("Network #%d\n",cas);
for(int i=0; i<n-1; i++)
{
double temp=cmp(ans[i],ans[i+1]);
printf("Cable requirement to connect (%d,%d) to (%d,%d) is %.2lf feet.\n",p[ans[i]].x,p[ans[i]].y,p[ans[i+1]].x,p[ans[i+1]].y,temp+16);
sum+=16;
}
printf("Number of feet of cable required is %.2lf.\n",sum+min);
}
return 0;
}