PKU 1379 Run Away(模拟退火算法)
题目大意:原题链接
给出指定的区域,以及平面内的点集,求出一个该区域内一个点的坐标到点集中所有点的最小距离最大.
解题思路:一开始想到用随机化算法解决,但是不知道如何实现。最后看了题解才知道原来是要用模拟退火算法解决。
不过个人感觉这个算法的实现过程中仍然采用了随机化算法。二者均属于概率算法。 参考链接

Point Goto_Rand_Dir(double key,Point temp)函数中,Point temp必须得定义在参数中,不能定义在函数内部,
否则temp没有初始值,无法进行后面的加法运算.
#include<ctime>
#include<cmath>
#include<cstdio>
#include<cstdlib>
const int shift=;
const double inf=1e10;
const double pi=acos(-1.0);
struct Point
{
double x,y;
}p[],randp[]; double Get_Dis(Point a,Point b)
{
return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}
Point Get_Rand_Point(int a,int b)
{
Point temp;
temp.x=rand()%a+;
temp.y=rand()%b+;
return temp;
}
Point Goto_Rand_Dir(double key,Point temp)
{
double delta=*pi*(double)rand()/RAND_MAX;
temp.x+=key*sin(delta);
temp.y+=key*cos(delta);
return temp;
} int main()
{
double dis[];
int i,j,k,T,x,y,m;
scanf("%d",&T);
srand(time(NULL));
while(T--){
double now;
Point temp;
scanf("%d%d%d",&x,&y,&m);
for(i=;i<=m;i++)
scanf("%lf%lf",&p[i].x,&p[i].y);
for(i=;i<=;i++){//分别往四个方向找四个方向的最小值
dis[i]=inf;
randp[i]=Get_Rand_Point(x,y);//给randp[]数组随机取横纵坐标值
for(j=;j<=m;j++){
now=Get_Dis(randp[i],p[j]);
if(now<dis[i]) dis[i]=now;//dis[i]存的是最小值
}
}
double key=sqrt(1.0*(x*x+y*y))/;//关键
while(key>=0.01){//精度要求
for(i=;i<=;i++){
for(j=;j<=shift;j++){
temp=randp[i];//采用之前四个方向确定的随机横纵坐标值
temp=Goto_Rand_Dir(key,temp);
if(temp.x<||temp.y<||temp.x>x||temp.y>y)
continue;
now=inf;
for(k=;k<=m;k++){
double dist=Get_Dis(temp,p[k]);
if(now>dist) now=dist;//now存的是最小值
}
if(now>dis[i]){
dis[i]=now;//dis[i]中存的是最小值最大
randp[i]=temp;
}
}
}
key=key*0.8;
}
for(i=,k=;i<=;i++)//在四个方向中找最小值最大
if(dis[i]>dis[k]) k=i;
printf("The safest point is (%.1lf, %.1lf).\n",randp[k].x,randp[k].y);
}
}
PKU 1379 Run Away(模拟退火算法)的更多相关文章
- poj-1379 Run Away(模拟退火算法)
题目链接: Run Away Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 7982 Accepted: 2391 De ...
- poj 1379 Run Away 模拟退火 难度:1
Run Away Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 6482 Accepted: 1993 Descript ...
- POJ.1379.Run Away(模拟退火)
题目链接 POJ输出不能用%lf! mmp从4:30改到6:00,把4:30交的一改输出也过了. 于是就有了两份代码.. //392K 500MS //用两点构成的矩形更新,就不需要管边界了 #inc ...
- 模拟退火算法(run away poj1379)
http://poj.org/problem?id=1379 Run Away Time Limit: 3000MS Memory Limit: 65536K Total Submissions: ...
- 模拟退火算法-[HDU1109]
模拟退火算法的原理模拟退火算法来源于固体退火原理,将固体加温至充分高,再让其徐徐冷却,加温时,固体内部粒子随温升变为无序状,内能增大,而徐徐冷却时粒子渐趋有序,在每个温度都达到平衡态,最后在常温时达到 ...
- poj-2420 A Star not a Tree?(模拟退火算法)
题目链接: A Star not a Tree? Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5219 Accepte ...
- 【高级算法】模拟退火算法解决3SAT问题(C++实现)
转载请注明出处:http://blog.csdn.net/zhoubin1992/article/details/46453761 ---------------------------------- ...
- 模拟退火算法(SA)求解TSP 问题(C语言实现)
这篇文章是之前写的智能算法(遗传算法(GA).粒子群算法(PSO))的补充.其实代码我老早之前就写完了,今天恰好重新翻到了,就拿出来给大家分享一下,也当是回顾与总结了. 首先介绍一下模拟退火算法(SA ...
- 原创:工作指派问题解决方案---模拟退火算法C实现
本文忽略了对于模拟退火的算法的理论讲解,读者可参考相关的博文或者其他相关资料,本文着重于算法的实现: /************************************************ ...
随机推荐
- hdu 1233 还是畅通project
本题链接:点击打开链接 本题大意: 有n个村庄,n*(n-1)/2条路,输入每条路所连接是哪两个村庄及长度,求使全部村庄均连通(并不是都两两连通) 所铺公路的最短路程. 解题思路: 使用并查集基础及K ...
- Maven中将所有依赖的jar包全部导出到文件夹
因为我要对Java类的功能在生产环境(服务器端)进行测试,所以需要将jar包导出,然后在服务器端用-Djava.ext.dirs=./lib的方式走一遍, 下面是解决方案: 在pom.xml中加入如下 ...
- EF 序列化实体为Json时的循环引用问题(不用自己写实体,不用匿名类型,不用EF的上下文属性)
自己写实体可以完美解决这个问题.(支持时间格式自定义) 用匿名类型也可以. 设置上下文方法如下: (jz为数据库上下文对象) jz.Configuration.ProxyCreationEnabled ...
- thinkphp中ajaxReturn的用法
1.例子: if ($codeid = $model->addCustomer($this->admin["id"])) { $data["code" ...
- (转)word尾注引文添加方式及相关问题
word引文添加方式:http://www.office68.com/word/word-reference-add.html word通配符:http://www.3lian.com/edu/201 ...
- Mac 安装Jupyter notebook
python:mac下自带Python 2.7.10 1.先升级了pip安装工具:sudo python -m pip install --upgrade --force pip 2.安装setupt ...
- spring boot 启动数据库报错(Exception during pool initialization.)
2018-06-27 14:12:28.804 ERROR 14312 --- [ restartedMain] com.zaxxer.hikari.pool.HikariPool : HikariP ...
- 在Sql2000 sql2005 sql2008 下已能实现事务复制的强制订阅,但请求订阅始终不能实现总有下列错误提示
硬件环境 : 一台服务器 安装了 sqlserver2008 数据库 局域网还有一台机器 安装了 sqlserver2000数据库 两台server 通信 共享均没有问题 同步过程中遇到的问题 : ...
- Java千百问_05面向对象(011)_引用传递和值传递有什么差别
点击进入_很多其它_Java千百问 1.什么是值传递 值传递,是将内存空间中某个存储单元中存放的值,传送给还有一个存储单元.(java中的存储单元并不是物理内存的地址,但具有相关性) 比如: //定义 ...
- Spring_day03--课程安排_基于aspectj的注解aop_Spring的jdbcTemplate操作
Spring_day03 上节内容回顾 今天内容介绍 基于aspectj的注解aop Spring的jdbcTemplate操作 增加 修改 删除 查询 Spring配置c3p0连接池和dao使用jd ...