前情:在谷上刷题时,偶然遇见吃奶酪。一看:这不是机构网站的题吗?简简单单轻轻松松!学DFS时早就AC了!于是我复制+粘贴后发现居然40分!天塌了!
于渝是乎:我来这里玄关求条(有注释贴心到位)
码子:
#include <bits/stdc++.h>
using namespace std;
//枚举全排列,打擂台找最少得距离
int n, r[15], c[15], vis[15], box[15];
double minans = 1e9;
void dfs(int cur)
{
if(cur > n)
{
double ans = 0; //存储每种方案距离
//生成全排列方案 注意是从0,0坐标开始
for(int i = 1; i <= n; i++)
{
//根据横纵坐标计算斜边距离
int x = r[box[i]] - r[box[i-1]];
int y = c[box[i]] - c[box[i-1]];
double t = sqrt(x*x + y*y);
ans += t; //累加距离
}
//打擂台 最少距离
minans = min(minans, ans);
return ;
}
//扩展下一个盒子
for(int i = 1; i <= n; i++)
{
if(vis[i] == 0) //没有被标记过
{
vis[i] = 1; //标记
box[cur] = i;
dfs(cur+1); //继续搜索下一个盒子
vis[i] = 0; //回溯
}
}
}
int main()
{
cin >> n;
for(int i = 1; i <= n; i++)
{
cin >> r[i] >> c[i]; //输入行和列的坐标
}
//枚举全排列
dfs(1); //从第一个盒子开始搜索
cout << fixed << setprecision(2) << minans;
return 0;
}
当然,最后还是爆出规定时间了……
本来一看别人的状压DP长代码感觉自己占了便宜,没想到啊……
今天还遭遇了你谷日爆