UVA 216 Getting in Line

UVA 216 Getting in Line

深搜回溯,找出最短的路径。。搜索过程中保存下路径。最后输出。。

其实也可以用全排列的next_permutation 暴力找出最短。。

#include <stdio.h>
#include <string.h>
#include <math.h>

int n;
double x[10], y[10];
int vis[10];
int lu[10];
int minlu[10];
int tt;
double dd;
void dfs(int num, double sum, int nn)
{
    if (num == n)
    {
	if (dd > sum)
	{
	    dd = sum;
	    for (int i = 0; i < n; i ++)
	    {
		minlu[i] = lu[i];
	    }
	}
	return;
    }
    for (int i = 0; i < n; i ++)
    {
	if (vis[i] == 0)
	{
	    double d = sqrt((x[i] - x[nn]) * (x[i] - x[nn]) + (y[i] - y[nn]) * (y[i] - y[nn])) + 16;
	    vis[i] = 1;
	    lu[num] = i;
	    dfs(num + 1, sum + d, i);
	    lu[num] = -1;
	    vis[i] = 0;
	}
    }
}
int main()
{
    int tt = 1;
    while (scanf("%d", &n) != EOF && n)
    {	
	dd = 1000000000;
	memset(vis, 0 ,sizeof(vis));
	memset(x, 0, sizeof(x));
	memset(y, 0, sizeof(y));
	memset(lu, -1, sizeof(lu));
	memset(minlu, 0, sizeof(minlu));
	for (int i = 0; i < n ; i ++)
	{
	    scanf("%lf%lf", &x[i], &y[i]);
	}
	for (int i = 0; i < n; i ++)
	{ 
	    lu[0] = i;
	    vis[i] = 1;
	    dfs(1, 0, i);
	    vis[i] = 0;
	    lu[0] = -1;
	}
	printf("**********************************************************\n");
	printf("Network #%d\n", tt ++);
	for (int i = 0; i < n - 1 ; i++)
	{
	    double ddd;
	    ddd = sqrt((x[minlu[i]] - x[minlu[i + 1]]) * (x[minlu[i]] - x[minlu[i + 1]]) + (y[minlu[i]] - y[minlu[i + 1]]) * (y[minlu[i]] - y[minlu[i + 1]]));
	    printf("Cable requirement to connect (%d,%d) to (%d,%d) is %.2lf feet.\n", int(x[minlu[i]] + 0.5),int(y[minlu[i]] + 0.5),int(x[minlu[i + 1]] + 0.5),int (y[minlu[i + 1]] + 0.5), ddd + 16);
	}
	printf("Number of feet of cable required is %.2lf.\n", dd);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值