poj1379

题意

给出 n 个洞的坐标,要求找到一点使得这一点距离最近洞的距离最远。

分析

通过这道题学习一下模拟退火算法

这种随机化的算法,在求解距离且精度要求较小时很有用。

简而言之,由随机选取的多个初始点,进行多次的随机变换,并根据是否更优而选择是否保留答案,

那么首先要选择两个值,delta 表示初始最大变换的半径(即对应初始的火温),d 控制半径缩小的快慢(火温减小的快慢)。

这道题,比较直白,随机变换就是改变坐标的位置(通过半径和角度就可以变换坐标,当然角度也是随机的),若变换后距所有点的距离增大了那么则更优。

code

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<ctime>
using namespace std;
const int MAXN = 1005;
const int MAXP = 20; // 随机选取 20 个点
const double PI = acos(-1.0);
double X, Y;
int n;
double dis[100];
struct P
{
double x, y;
P() {}
P(double _x, double _y) : x(_x), y(_y) {}
P operator - (P p)
{
return P(x - p.x, y - p.y);
}
double dis()
{
return sqrt(x * x + y * y);
}
}a[MAXN], ans[MAXN];
double getMinDis(P p)
{
double as = 1e9;
for(int i = 0; i < n; i++)
{
as = min(as, (p - a[i]).dis());
}
return as;
}
P SA()
{
for(int i = 0; i < MAXP; i++)
{
ans[i].x = (rand() % 1000 + 1) / 1000.0 * X;
ans[i].y = (rand() % 1000 + 1) / 1000.0 * Y;
dis[i] = getMinDis(ans[i]);
}
double delta = max(X, Y) / sqrt(n * 1.0), d = 0.9;
while(delta > 0.01) // 边界最小值
{
for(int i = 0; i < MAXP; i++)
{
for(int j = 0; j < 20; j++)
{
P t = ans[i];
double angle = rand() % 1000 / 1000.0 * 2 * PI;
t.x += delta * cos(angle) * (rand() % 1000 / 1000.0);
t.y += delta * sin(angle) * (rand() % 1000 / 1000.0);
if(t.x < 0 || t.x > X || t.y < 0 || t.y > Y) continue;
double tmp = getMinDis(t);
if(tmp > dis[i])
{
dis[i] = tmp;
ans[i] = t;
}
}
}
delta *= d;
}
double dd = 0;
int pp = 0;
for(int i = 0; i < MAXP; i++)
{
if(dis[i] > dd)
{
dd = dis[i];
pp = i;
}
}
return ans[pp];
}
int main()
{
srand(time(0));
int T;
for(scanf("%d", &T); T--;)
{
scanf("%lf%lf%d", &X, &Y, &n);
for(int i = 0; i < n; i++)
{
scanf("%lf%lf", &a[i].x, &a[i].y);
}
P p = SA();
printf("The safest point is (%.1f, %.1f).\n", p.x, p.y);
}
return 0;
}

最新文章

  1. NOIP模拟赛20161023
  2. WinForm------GridControl添加底部合计框
  3. HTTP API开发
  4. ElasticSearch入门系列(五)数据
  5. 【XLL API 函数】xlCoerce
  6. [ie兼容]ie7 margin-bottom失效
  7. 说说ID选择符、类选择符和HTML标记选择符的优先级顺序
  8. 快乐的JS正则表达式(一)
  9. 利用sqlserver日志恢复数据
  10. MyEclipse的 at com.genuitec.eclipse.ast.deploy.core.Deployment.&lt;init&gt;错误解决办法
  11. How to achieve dialog with lookup control
  12. ExtJS003单击按钮弹出window
  13. 【Linux】windows-linux、linux-linux文件互传
  14. Promise 返回值
  15. 改变input type=&quot;file&quot; 文字、样式等
  16. 详解 leetcode 猜数字大小 II
  17. linux随手笔记(Centos为主)
  18. Java实验报告(实验三)
  19. HA&amp;Federation【转】
  20. Websocket - Websocket原理(握手、解密、加密)、基于Python实现简单示例

热门文章

  1. HTTP 协议
  2. Extjs6(三)——用extjs6.0写一个简单页面
  3. ST-LINK调试完成
  4. uoj#228 基础数据结构练习题
  5. phpmyadmin的初始账号密码是多少
  6. hibernate 插入数据时让数据库默认值生效
  7. JS基础,你需要掌握的要点!
  8. Linux centos7下安装配置redis及Redis desktop Manager工具连接注意事项
  9. PHP获取指定页面的指定内容
  10. Js调用exe程序方法(通过URL Protocol实现网页调用本地应用程序)