学习C++从娃娃抓起!记录下洛谷C++学习和备考过程中的题目,记录每一个瞬间。
附上汇总贴:洛谷刷题C++语言 | 汇总_热爱编程的通信人的博客-CSDN博客
【题目描述】
房间里放着 n 块奶酪。一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在 (0,0) 点处。
【输入】
第一行有一个整数,表示奶酪的数量 n。
第 2 到第 (n+1) 行,每行两个实数,第 (i+1) 行的实数分别表示第 i 块奶酪的横纵坐标 xi,yi。
【输出】
输出一行一个实数,表示要跑的最少距离,保留 2 位小数。
【输入样例】
4
1 1
1 -1
-1 1
-1 -1
【输出样例】
7.41
【代码详解】
#include <bits/stdc++.h>
using namespace std;
struct point {
double x, y;
bool visit;
int num;
}ps[16];
int n;
double ans=DBL_MAX, f[16][33000]={0};
double dis(point p1, point p2)
{
return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
}
void dfs(point p, int step, int mark, double s)
{
if (step==n) {
if (ans>s) ans = s;
return;
}
for (int i=0; i<n; i++) {
if (ps[i].visit) continue;
int tmp = mark + (1 << i);
if (f[i][tmp]==0 || f[i][tmp] > f[p.num][mark]+dis(ps[i], p)) {
f[i][tmp] = f[p.num][mark]+dis(ps[i], p);
ps[i].visit = 1;
dfs(ps[i], step+1, tmp, s+dis(ps[i], p));
ps[i].visit = 0;
}
}
}
int main()
{
cin >> n;
for (int i=0; i<n; i++) {
cin >> ps[i].x >> ps[i].y;
ps[i].visit = 0;
ps[i].num = i;
}
point p = {0,0,1,0};
dfs(p, 0, 0, 0);
printf("%.2f", ans);
return 0;
}
【运行结果】
4
1 1
1 -1
-1 1
-1 -1
7.41