UvaOJ 216 Getting in Line

全排列,每次计算距离,记录最小值

如果数据量再大些的话,可以用递归进行全排列,及时计算距离并与当前最小值对比,并减枝,在这里就不实现啦~

另外不知道为什么在Uva里一用宏就RE,只能把swap和dis改成函数定义了。。。

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

void swap(int* a, int *b) {
	int tmp = *a;
	*a = *b;
	*b = tmp;
}

double dis(double xi, double yi, double xj, double yj) {
	return sqrt((xi-xj)*(xi-xj) + (yi-yj)*(yi-yj));
}

int nextPermutation(int a[], int n) {
	int i, j;
	for (i=n-1 ; i>=1 ; i--)
		if (a[i-1] < a[i])
			break;
	if (i == 0)
		return 0;
	for (j=i+1 ; j<n ; j++)
		if (a[j] <= a[i-1])
			break;
	swap(&a[i-1], &a[j-1]);
	for (j=n-1 ; i<j ; i++, j--)
		swap(&a[i], &a[j]);
	return 1;
}

int main() {
	int n, a[10], i, j, c, b[10];
	double x[10], y[10];
	for (c=1 ; scanf("%d", &n) != EOF && n ; c++) {
		for (i=0 ; i<n ; i++) {
			scanf("%lf%lf", x+i, y+i);
			a[i] = i;
		}
		printf("**********************************************************\n");
		printf("Network #%d\n", c);
		double min = 10000000.0;
		do {
			double d = 0.0;
			for (i=1 ; i<n ; i++)
				d += dis(x[a[i-1]], y[a[i-1]], x[a[i]], y[a[i]]);
			if (d < min) {
				min = d;
				memcpy(b, a, sizeof(int)*10);
			}
		} while (nextPermutation(a, n));
		min = 0.0;
		for (i=1 ; i<n ; i++) {
			double d = dis(x[b[i-1]], y[b[i-1]], x[b[i]], y[b[i]]) + 16;
			min += d;
			printf("Cable requirement to connect (%.lf,%.lf) to (%.lf,%.lf) is %.2lf feet.\n", 
					x[b[i-1]], y[b[i-1]], x[b[i]], y[b[i]], d);
		}
		printf("Number of feet of cable required is %.2lf.\n", min);
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Erlang是一种功能性编程语言,最初是为了电话交换系统而设计的,具有并发、容错和分布式计算的能力。在功能性编程中,我们将程序视为一系列函数的集合,而不是一系列指令的序列。这种思维方式使得编写可靠、可扩展和可维护的软件变得更加容易。 要开始学习Erlang,我们首先需要安装它。Erlang可在多个操作系统上运行,包括Windows、Linux和Mac OS。我们可以从Erlang官方网站下载适合自己操作系统的安装程序,并按照提示进行安装。 安装完Erlang后,我们可以在命令行界面(或终端)中启动Erlang Shell(也称为Erlang交互式环境)。在Shell中,我们可以输入并执行Erlang代码。 Erlang的基本语法与其他编程语言有些不同。在Erlang中,函数定义使用"fun"关键字,比如:Add = fun(X, Y) -> X + Y end. 这将定义一个名为Add的函数,它接受两个参数X和Y,并返回它们的和。 在Erlang中,我们可以使用模式匹配来处理不同的情况。例如,我们可以编写一个函数来计算一个列表中所有元素的和,如下所示: sum([]) -> 0; sum([H|T]) -> H + sum(T). 当我们传递一个空列表[ ]给sum函数时,它将返回0。而当我们传递一个非空列表[H|T]时,它将把列表的头部元素H与剩余部分T的和相加。 在学习Erlang时,重要的是要尝试编写简单的程序和函数,以便熟悉基本的语法和概念。您可以使用Erlang Shell来交互式地测试和执行您的代码。 除了基本的语法和概念之外,Erlang还具有许多强大的特性,例如并发编程、消息传递和模式匹配。这些功能使Erlang成为开发可靠、高可扩展性的分布式系统的理想选择。 总之,Erlang是一种功能强大的功能性编程语言,它具有并发、容错和分布式计算的能力。我们可以通过安装Erlang并在Erlang Shell中尝试编写简单的程序,来快速上手Erlang。在学习过程中,我们将逐步掌握Erlang的基本语法和概念,为开发可靠和高可扩展的系统打下坚实的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值