P1433 吃奶酪 (dfs+剪枝)

题目描述
房间里放着n块奶酪。一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在(0,0)点处。
输入输出格式
输入格式:
第一行一个数n (n<=15)
接下来每行2个实数,表示第i块奶酪的坐标。
两点之间的距离公式=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))
输出格式:
一个数,表示要跑的最少距离,保留2位小数。
输入输出样例
输入样例#1: 复制
4
1 1
1 -1
-1 1
-1 -1
输出样例#1: 复制
7.41

直接暴力会超时,剪枝一下。。。

#include<bits/stdc++.h>
using namespace std;
double sum=0,ans=1000000000;int n;	double a[20],b[20],c[20];double dis[20][20];
void dfs(int w,int r)
{
	if(sum>ans)//这剪枝有点。。。 
	return ;
	if(r==n)
	{
		if(ans>sum)
		ans=sum;
		return ;
	}
	for(int i=1;i<=n;i++)
	{
		if(c[i]==0)
		{
	        sum=sum+dis[w][i];	
			c[i]=1;
			dfs(i,r+1);
			c[i]=0;
			sum=sum-dis[w][i];	
		}
	}
}
int main()
{
	

	scanf("%d",&n);
	memset(c,0,sizeof(c));
	for(int i=1;i<=n;i++)
	{
	    scanf("%lf %lf",&a[i],&b[i]);	
	}
	for(int i=0;i<=n;i++)
	{
		for(int j=0;j<=n;j++)
		dis[i][j]=sqrt((a[i]-a[j])*(a[i]-a[j])+(b[i]-b[j])*(b[i]-b[j]));
	}
	c[0]=1;
	dfs(0,0);
	printf("%.2lf\n",ans);
	return 0;
 } 

猜你喜欢

转载自blog.csdn.net/liuliu2333/article/details/80200033