题目描述
房间里放着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<cmath> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int n; double ans=0x7f7f7f7f; struct nond{ double x,y; }cnt[16]; int vis[16]; double dis[16][16]; void dfs(int tot,double sum,int pre){ if(sum>ans) return ; if(tot==n){ ans=min(ans,sum); return ; } for(int i=1;i<=n;i++) if(!vis[i]){ vis[i]=1; dfs(tot+1,sum+dis[pre][i],i); vis[i]=0; } } int main(){ scanf("%d",&n); cnt[0].x=0;cnt[0].y=0; for(int i=1;i<=n;i++) scanf("%lf%lf",&cnt[i].x,&cnt[i].y); for(int i=0;i<=n;i++) for(int j=i;j<=n;j++) dis[i][j]=dis[j][i]=sqrt((cnt[i].x-cnt[j].x)*(cnt[i].x-cnt[j].x)+(cnt[i].y-cnt[j].y)*(cnt[i].y-cnt[j].y)); vis[0]=1; dfs(0,0,0); printf("%.2lf",ans); }