洛谷 P1433 吃奶酪【DFS】+剪枝
题目链接:https://www.luogu.org/problemnew/show/P1433
题目描述
房间里放着n块奶酪。一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在(0,0)点处。
输入格式:
第一行一个数n (n<=15)
接下来每行2个实数,表示第i块奶酪的坐标。
两点之间的距离公式=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))
输出格式:
一个数,表示要跑的最少距离,保留2位小数。
4
1 1
1 -1
-1 1
-1 -1
7.41 解题分析:
此题若用dfs来做的话,需要剪枝,不然必定超时,常规的有两种剪枝方法:
1.当搜索的距离大于此时保存的最小总距离的时候,这条dfs路线必然不符合要求,直接return,这个很关键。
2.搜索的时候不断求两点之间的距离非常耗时,所以我们可以在一开始就打好表,用dis[][]二维数组储存每两点之间的距离,然后后面搜索的时候直接调用就好了。(不过下面我的代码没有用到这个剪枝,也勉强AC了)
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
#define INF 0x3f3f3f3f
int n, res;double ans;
int vis[];
struct node
{
double x, y;
};
node arr[]; double dis(node a, node b)
{
double sum = ;
sum += sqrt((a.x - b.x)*(a.x - b.x)*1.0 + (a.y - b.y)*(a.y - b.y)*1.0);
return sum;
} void dfs(int ord,double distance) //当前点的序号 、总距离
{
if (distance >= ans)return; //如果距离大于等于现在的最小值,该dfs路线直接放弃,这个剪枝很重要
if (res == n&&distance<ans)
{
ans = distance; //更新最小值
}
for (int i = ; i <= n; i++)
{
if (!vis[i])
{
res++; vis[i] = ; //选这个点
dfs(i, distance + dis(arr[ord], arr[i]));
res--; vis[i] = ; //清空当前选择
}
}
} int main()
{
scanf("%d", &n);
for (int i = ; i <= n; i++)
{
scanf("%lf %lf", &arr[i].x, &arr[i].y);
}
arr[].x = ,arr[].y=;
ans = INF; res = ;
dfs(,);
printf("%.2lf\n", ans);
return ;
}
用了二维数组记录两点之间距离代码
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <iostream>
using namespace std;
#define INF 0x3f3f3f3f
int n,cur;
double ans; struct node
{
double x, y;
};
node arr[];
int vis[];
double map[][]; double dis(int i, int j)
{
return sqrt((arr[i].x-arr[j].x)*(arr[i].x - arr[j].x)+(arr[i].y-arr[j].y)*(arr[i].y - arr[j].y));
} void dfs(int ord,double sum)
{
if (sum >= ans)return;
if (cur == n)
{
ans = min(sum, ans);
}
else
{
for (int i = ; i <= n; i++)
{
if (!vis[i])
{
vis[i] = ; cur++;
dfs(i,sum +map[ord][i]);
vis[i] = ; cur--;
}
}
}
} int main()
{
cin >> n;
arr[].x = , arr[].y = ;
for (int i = ; i <= n; i++)
{
scanf("%lf %lf", &arr[i].x, &arr[i].y);
}
for (int i = ; i <= n; i++)
{
for (int j = ; j <= n; j++)
{
map[i][j] = dis(i, j); //开一个二维数组来记录任意两个点之间的距离,省的以后多次求(虽然对这道题来说并没有优化多少)
} //注意此时i-j的距离,还要记录j-i的距离,虽然这两个距离的值是一样的,但是遍历的时候,i有可能在j的前面,也有可能在j的后面,所以map[i][j]和map[j][i]都要记录
}
memset(vis, , sizeof(vis));
ans = INF,cur=;
dfs(,);
printf("%.2lf\n", ans);
return ;
}
2018-05-31
洛谷 P1433 吃奶酪【DFS】+剪枝的更多相关文章
- 洛谷 - P1433 - 吃奶酪 - dfs
		
https://www.luogu.org/problemnew/show/P1433 并不是每一个求最短距离就是bfs,这个肯定是dfs. 直接计算15!可以知道枚举必定超时,但是! 我们dfs非常 ...
 - 洛谷P1433 吃奶酪【dfs】【剪枝】
		
题目:https://www.luogu.org/problemnew/show/P1433 题意: 给定n个坐标,要求从(0,0)开始走遍所有点,最少经过的路程. 思路: 刚开始想像数字三角形一样适 ...
 - 洛谷 P1433 吃奶酪 Label:dfs && 剪枝Ex
		
题目描述 房间里放着n块奶酪.一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在(0,0)点处. 输入输出格式 输入格式: 第一行一个数n (n<=15) 接下来每行2个实数,表示第i块 ...
 - 洛谷 P1433 吃奶酪(记忆化)
		
题目描述 房间里放着n块奶酪.一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在(0,0)点处. 输入输出格式 输入格式: 第一行一个数n (n<=15) 接下来每行2个实数,表示第i块 ...
 - 集训作业 洛谷P1433 吃奶酪
		
嗯?这题竟然是个绿题. 这个题真的不难,不要被他的难度吓到,我们只是不会计算2点之间的距离,他还给出了公式,这个就有点…… 我们直接套公式去求出需要的值,然后普通的搜索就可以了. 这个题我用的深搜,因 ...
 - 洛谷 P1433 吃奶酪
		
题目描述 房间里放着n块奶酪.一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在(0,0)点处. 输入输出格式 输入格式: 第一行一个数n (n<=15) 接下来每行2个实数,表示第i块 ...
 - 洛谷P1433 吃奶酪 题解 状态压缩DP
		
题目链接:https://www.luogu.com.cn/problem/P1433 题目大意 房间里放着 \(n\) 块奶酪.一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在 \((0, ...
 - 洛谷P1433 吃奶酪
		
#include<iostream> #include<math.h> using namespace std ; ; int n; bool st[N]; double x[ ...
 - 洛谷 P1433 吃奶酪 状压DP
		
题目描述 分析 比较简单的状压DP 我们设\(f[i][j]\)为当前的状态为\(i\)且当前所在的位置为\(j\)时走过的最小距离 因为老鼠的坐标为\((0,0)\),所以我们要预处理出\(f[1& ...
 
随机推荐
- 2018-2019-2 网络对抗技术 20165230 Exp2 后门原理与实践
			
目录 1.实验内容 2.基础问题回答 3.常用后门工具实践 3.1netcat 3.2Meterpreter 3.3socat 4.实验过程 任务一:使用netcat获取主机操作Shell,cron启 ...
 - 【网络编程1】网络编程基础-TCP、UDP编程
			
网络基础知识 网络模型知识 OSI七层模型:(Open Systems Interconnection Reference Model)开放式通信系统互联参考模型,是国际标准化组织(ISO)提出的一个 ...
 - ARMV8 datasheet学习笔记1:预备知识
			
1. 前言 ARMv8的架构继承以往ARMv7与之前处理器技术的基础; 除了支持现有的16/32bit的Thumb2指令外,也向前兼容现有的A32(ARM 32bit)指令集. 基于64bit的AAr ...
 - oracle数据文件迁移
			
这篇文章是从网络上获取的,然后根据内容一步步操作, 1.目前的疑问:移动日志文件的时候,为何要先进行切换? 2.move操作后,再进行rename操作的原理 --------------------- ...
 - freerradius 错误:pap: WARNING: No "known good" password found for the user
			
具体错误如下: 1) # Executing section authorize from file /usr/local/etc/raddb/sites-enabled/default(1) a ...
 - jumpserver会话终端故障
			
查看jumpserver的终端,发现无法访问,情况如下图 页面中提到,需要部署luna,coco和nginx的url分发. 然后进入到jumpserver的服务器,发现nginx启动了,但是没有coc ...
 - nodejs服务器读取图片返回给前端(浏览器)显示
			
1 前言 项目需要用nodejs服务器给前端传递图片,网上找了好多资料,多数都是怎么在前端上传图片的,然后通过看runoob.com菜鸟教程,发现其实是非常简单,用express框架就行了. 2 代码 ...
 - PYTHON-模块time&datetime+ 目录规范
			
1.目录规范 ***** (1)文件夹的规范写法 bin 可执行文件 conf 配置文件 core 主要业务逻辑 db 数据文件 lib 库 (公共代码 第三方模块) log 日志文件 readme ...
 - Linux查看文件命令
			
linux查看日志文件内容命令有 cat 由第一行开始显示文件内容 tac 从最后一行开始显示,可以看出 tac 是 cat 的倒着写 nl 显示的时候,顺道输出行号! more 一页一页的显示文件内 ...
 - Java基础99 待续
			
1.待续 原创作者:DSHORE 作者主页:http://www.cnblogs.com/dshore123/ 原文出自:https://www.cnblogs.com/dshore123/p/107 ...