赞
踩
房间里放着 n 块奶酪。一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在 (0,0) 点处。
第一行一个正整数 n。
接下来每行 2 个实数,表示第i块奶酪的坐标。
两点之间的距离公式为 \sqrt{(x_1-x_2)2+(y_1-y_2)2}
一个数,表示要跑的最少距离,保留 2 位小数。
4
1 1
1 -1
-1 1
-1 -1
7.41
1≤n≤15。
这个代码我优化过了,题解里同样用dfs+剪枝(加了个预处理)的代码我也看了,两个代码我都试了,很遗憾都没过…题解里瞅状压DP可以过,同样很遗憾,我不会,准备过段时间再学那个。
#include<bits/stdc++.h> using namespace std; int n; float minn = 100000.0; class node { public: float x = 0.0, y = 0.0; }beginn; node a[15]; int b[15] = { 0 };//标记 float dfs(node t, int num, float l) { if (l >= minn)//剪枝 return minn; if (num == n) { minn = min(minn, l); return minn; } for (int i = 0; i < n; i++) if (!b[i]) { b[i] = 1;//记忆 dfs(a[i], num + 1, l + sqrt((t.x - a[i].x) * (t.x - a[i].x) + (t.y - a[i].y) * (t.y - a[i].y))); b[i] = 0;//回溯 } return minn; } int main() { cin >> n; for (int i = 0; i < n; i++) cin >> a[i].x >> a[i].y; printf("%.2f",dfs(beginn, 0, 0)); return 0; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。