- 论坛徽章:
- 11
|
算了,是这样的,取重心然后逐渐逼近最优解~- #include <iostream>
- #include <cstdio>
- #include <cstdlib>
- #include <cmath>
- #include <cstring>
- #include <stack>
- #include <map>
- #include <string>
- using namespace std;
- struct pt {
- double x;
- double y;
- double r;
- };
- pt mkp(double x, double y) {
- pt ret;
- ret.x = x;
- ret.y = y;
- return ret;
- }
- double dis(pt a, pt b) {
- return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
- }
- double cost(pt *p, double x, double y) {
- double ang[3];
- for (int i = 0; i < 3; i++) ang[i] = dis(p[i], mkp(x, y)) / p[i].r;
- double diff[3];
- for (int i = 0; i < 3; i++) diff[i] = ang[i] - ang[(i+1)%3];
- double ret = 0;
- for (int i = 0; i < 3; i++) ret += diff[i] * diff[i];
- return ret;
- }
- const int dx[] = {0, 1, -1, 0};
- const int dy[] = {1, 0, 0, -1};
- const double err = 1e-6;
- int main(int argc, char *argv[]) {
- pt p[3];
- for (int i = 0; i < 3; i++) scanf("%lf %lf %lf", &(p[i].x), &(p[i].y), &(p[i].r));
- pt ans;
- ans.x = (p[0].x + p[1].x + p[2].x) / 3.0;
- ans.y = (p[0].y + p[1].y + p[2].y) / 3.0;
- double ncost = cost(p, ans.x, ans.y);
- pt tmp;
- double step = 1.0;
- bool flag = false;
- for (int i = 0; i < 300000 && ncost > err; i++) {
- flag = false;
- for (int k = 0; k < 4; k++) {
- tmp.x = ans.x + step * ((double)dx[k]);
- tmp.y = ans.y + step * ((double)dy[k]);
- if (ncost > cost(p, tmp.x, tmp.y)) {
- ncost = cost(p, tmp.x, tmp.y);
- ans = tmp;
- flag = true;
- }
- }
- if (!flag) step *= 0.5;
- }
- if (cost(p, ans.x, ans.y) <= err)
- printf("%.5lf %.5lf\n", ans.x, ans.y);
- return 0;
- }
复制代码 |
|