当前位置: 代码迷 >> 综合 >> SRM 500 DIV1 B
  详细解决方案

SRM 500 DIV1 B

热度:12   发布时间:2023-12-06 10:03:05.0

    递归算法在几何计算上的应用...好题...

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <memory.h>
#include <string>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <algorithm>
#include <iostream>using namespace std;class FractalPicture {
public:double getLength(int x1, int y1, int x2, int y2) {return solve(x1, y1, x2, y2, 500);}double solve(int x1, int y1, int x2, int y2, int gen) {if (gen == 0) return 0.0;if (x1 < -27) x1 = -27;if (x2 > 27) x2 = 27;if (y1 < 0) y1 = 0;if (y2 > 81) y2 = 81;if (x1 > x2 || y1 > y2)return 0.0;if (x1 == -27 && x2 == 27 && y1 == 0 && y2 == 81)return 81.0 + 54.0 * (gen - 1);double res = 0.0;if (x1 <= 0 && x2 >= 0) {if (gen != 1)res += max(min(54, y2) - y1, 0);elseres += y2 - y1;}res += solve((y1 - 54) * 3, -x2 * 3, (y2 - 54) * 3, -x1 * 3, gen - 1) / 3.0;res += solve((54 - y2) * 3, x1 * 3, (54 - y1) * 3, x2 * 3, gen - 1) / 3.0;res += solve(x1 * 3, (y1 - 54) * 3, x2 * 3, (y2 - 54) * 3, gen - 1) / 3.0;return res;}
};