UVA 216

本文介绍了一个使用回溯法寻找连接多个点的最短电缆路径的C语言程序。该程序定义了一个递归函数来尝试所有可能的节点排列,并计算每种排列的总电缆长度,以确定连接所有点所需的最短电缆长度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <stdio.h>
#include <string.h>
#include <math.h>
#define MAX 200
int n;
int p[MAX], ans[MAX], used[MAX]; 
float x[MAX], y[MAX], min;
float cal( float x1, float y1, float x2, float y2 )
{
	return sqrt( pow(x1-x2, 2) + pow(y1-y2, 2) ) + 16; 
}
void dfs( int val, int cur )
{
	int i;
	float sum = 0;
	if( cur == n )
	{
		for( i = 0; i < n-1; i++ )
			sum += cal( x[ p[i] ], y[ p[i] ], x[ p[i+1] ], y[ p[i+1] ] );
		if( sum < min )
		{
			min = sum;
			for( i = 0; i < n; i++ )
				ans[i] = p[i];
		}
	}
	else
	{
		used[val] = 1;
		for( i = 0; i < n; i++ )
			if( !used[i] )
			{	
				p[cur] = i;
				dfs( i, cur+1 ); 
			}
		used[val] = 0;
	}
}
int main()
{
	int cout = 1, i;
	while( scanf( "%d", &n ) && n )
	{
		min = 100000;
		printf( "**********************************************************\n" );
		printf( "Network #%d\n", cout++ );
		for( i = 0; i < n; i++  )
			scanf( "%f%f", &x[i], &y[i] );
		for( i = 0; i < n; i++ )
		{
			memset( used, 0, sizeof(used) );
			p[0] = i;
			dfs( i, 1 );
		}
		for( i = 0; i < n-1; i++ )
		printf( "Cable requirement to connect (%d,%d) to (%d,%d) is %.2f feet.\n", (int)x[ans[i]], (int)y[ans[i]], (int)x[ans[i+1]], (int)y[ans[i+1]], cal(x[ans[i]], y[ans[i]], x[ans[i+1]], y[ans[i+1]])  );
		printf( "Number of feet of cable required is %.2f.\n", min );

	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值