poj_1379_run away

这是一个使用C++解决的POJ 1379问题,主要内容是找到一个矩形区域中,最远离所有陷阱的安全点。通过随机生成并检查点,不断更新最安全点及其距离。
摘要由CSDN通过智能技术生成
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<cmath>
#include<string>
#include<vector>
#include<algorithm>
#include<map>
#include<set>
#include<ctime>
#pragma warning(disable:4996) 
#define EPS 1e-8
#define INF 2000000000
#define PI acos(-1.0)
const int N = 30;
const int M = 30;
using namespace std;
double X, Y;
class Point 
{
public:
	double x, y;
	bool isIn() 
	{
		if (x > -EPS&&x<EPS + X&&y>-EPS&&y < EPS + Y)
		{
			return true;

		}
		return false;
	}
};
double dist(const Point &p1,const Point &p2)
{
	return sqrt((p1.x - p2.x)*(p1.x - p2.x) + (p1.y - p2.y)*(p1.y - p2.y));
}
double getMinDist(const Point &p,const vector<Point>&point) 
{
	double ans = INF;
	for (size_t i = 0; i < point.size(); i++)
	{
		ans = min(ans, dist(point[i], p));
	}
	return ans;
}
int main() 
{
	//freopen("input.txt", "r", stdin);
	int T; cin >> T;
	srand((unsigned)time(NULL));
	while (T--) 
	{
		int n;
		cin >> X >> Y >> n;
		vector<Point>trap(n);//各陷阱的坐标
		for (int i = 0; i < n; i++)
		{
			cin >> trap[i].x >> trap[i].y;
		}
		//随机取各随机位置的坐标,并求得到该位置到离它最近的陷阱的距离
		vector<Point>random(N);
		vector<double>minidist(N);
		for (int i = 0; i < N; i++) 
		{
			random[i].x = (rand() % 10000) / 10000.0*X;
			random[i].y = (rand() % 10000) / 10000.0*Y;
			minidist[i] = getMinDist(random[i],trap);
		}
		double delta = max(X, Y) / (double)n;
		while (delta>1e-3) 
		{
			for (int i = 0; i<N; i++) 
			{
				for (int j = 0; j<M; j++) 
				{
					double theta = (rand() % 10000 ) / 10000.0 * 2 * PI;
					Point cur;
					cur.x = random[i].x + cos(theta)*delta;
					cur.y = random[i].y + sin(theta)*delta;
					if (!cur.isIn()) continue;
					double tmp = getMinDist(cur,trap);
					if (tmp>minidist[i]) 
					{
						random[i] = cur;
						minidist[i] = tmp;
					}
				}
			}
			delta *= 0.85;
		}
		int index = 0;
		double ans = 0;
		for (int i = 0; i<N; i++) 
		{
			if (minidist[i]>ans) 
			{
				ans = minidist[i];
				index = i;
			}
		}
		printf("The safest point is (%.1f, %.1f).\n", random[index].x, random[index].y);
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值