data:
3
0 0
10 10
3 5
2 1
7 7
3
0 0
10 10
3 5
2 1
7 7
- #include<iostream>
- #include<cmath>
- #include<string>
- #include<vector>
- using namespace std;
- const double PI = 3.14;
- int N;
- double lu[2];
- double rd[2];
- vector<vector<double> > data;
- vector<vector<double> > dist;
- //recursive search the area
- double getArea(int cur,double* r,bool* visited,int* next,double area)
- {
- double w = min(abs(lu[0] - data[cur][0]),abs(rd[0] - data[cur][0]));
- double h = min(abs(lu[1] - data[cur][1]),abs(rd[1] - data[cur][1]));
- double radius = min(w,h);
- for(int i = 0;i<N;i++)
- {
- if(i == cur)
- continue;
- double d = dist[cur][i];
- if(visited[i])
- {
- radius = min(radius,d - r[i]);
- }
- else
- {
- radius = min(radius,d);
- }
- }
- area += PI * radius * radius;
- visited[cur] = true;
- r[cur] = radius;
- double subarea = 0;
- int index = -1;
- for(int i = 0; i<N ;i++)
- {
- if(visited[i])
- continue;
- double aa = getArea(i,r, visited,next,area);
- if(aa > area)
- {
- area = aa;
- index = i;
- }
- }
- next[cur] = index;
- visited[cur] = false;
- return area;
- }
- int main()
- {
- // read the input
- cin>>N;
- cin>>lu[0]>>lu[1];
- cin>>rd[0]>>rd[1];
- data.resize(N);
- for(int i = 0;i<N;i++)
- {
- data[i].resize(2);
- for(int j= 0;j<2;j++)
- {
- cin>>data[i][j];
- }
- }
- /*
- * calculate
- */
- //all distance
- dist.resize(N);
- for(int i = 0;i<N;i++)
- {
- dist[i].resize(N);
- for(int j = 0;j<i;j++)
- {
- dist[i][j] = sqrt((data[i][0]- data[j][0])* (data[i][0]- data[j][0]) + (data[i][1]- data[j][1]) * (data[i][1]- data[j][1]) );
- dist[j][i] = dist[i][j];
- }
- }
- double* r = new double[N];
- bool* visited = new bool[N];
- int* next = new int[N];
- double maxArea = 0;
- int* order = new int[N];
- int index = -1;
- for(int i = 0;i< N;i++)
- {
- for(int j = 0;j<N;j++)
- {
- r[j]= 0;
- visited[j] = false;
- next[j] = -1;
- }
- // begin the search from the point i
- double area = getArea(i,r,visited,next,0);
- if(area >maxArea)
- {
- maxArea = area;
- index = i;
- for(int j = 0;j<N;j++)
- {
- order[j] = next[j];
- }
- }
- }
- while(index!= -1)
- {
- cout<<index<<endl;
- index = order[index];
- }
- delete[] visited;
- delete[] r;
- delete[] next;
- }