Pagini recente » Cod sursa (job #290637) | Cod sursa (job #1929870) | Cod sursa (job #248433) | Cod sursa (job #431935) | Cod sursa (job #2913130)
#include <bits/stdc++.h>
using namespace std;
ifstream in("triangulare.in");
ofstream out("triangulare.out");
typedef long double ld;
typedef pair<int,int> pii;
struct punct
{
int ind;
int x,y;
};
vector<punct> v;
vector<pii> ans;
int tst,n;
const ld eps=0.000000001;
const ld dif=0.000001;
bool intersect(punct a,punct b,punct c,punct d)
{
ld ax=a.x,ay=a.y;
ld bx=b.x,by=b.y;
ld cx=c.x,cy=c.y;
ld dx=d.x,dy=d.y;
ld mab=(ax-bx)/(ay-by+eps);
ld mcd=(cx-dx)/(cy-dy+eps);
if(mab==mcd)
{
if((cx-ax)*(dx-ax)>-dif or (cx-bx)*(dx-bx)>-dif or
(ax-cx)*(bx-cx)>-dif or (ax-dx)*(bx-dx)>-dif)
return true;
return false;
}
ld y=(ax-cx+cy*mcd-ay*mab)/(mcd-mab);
if((ay-y)*(by-y)>-dif and (cy-y)*(dy-y)>-dif)
return true;
return false;
}
void solve(vector<punct> v)
{
if(v.size()==3)
return ;
int n=v.size();
int area=v[n-1].x*v[0].y-v[0].x*v[n-1].y;
for(int i=0;i<n-1;++i)
area+=v[i].x*v[i+1].y-v[i+1].x*v[i].y;
area=abs(area);
for(int i=0;i<n-2;++i)
for(int j=i+2;j<n;++j)
if(!(i==0 and j==n-1))
{
bool stop=false;
if(i!=0 and i!=n-1 and j!=0 and j!=n-1 and intersect(v[i],v[j],v[n-1],v[0]))
continue;
for(int k=0;k<n-1;++k) if(k!=i and k!=j and k+1!=i and k+1!=j)
if(intersect(v[i],v[j],v[k],v[k+1]))
{
stop=true;
break;
}
if(stop)
continue;
int area1=v[j].x*v[i].y-v[i].x*v[j].y;
for(int k=i;k<j;++k)
area1+=v[k].x*v[k+1].y-v[k+1].x*v[k].y;
area1=abs(area1);
if(area1>area)
continue;
int area2=v[n-1].x*v[0].y-v[0].x*v[n-1].y;
for(int k=0;k<i;++k)
area2+=v[k].x*v[k+1].y-v[k+1].x*v[k].y;
area2+=v[i].x*v[j].y-v[j].x*v[i].y;
for(int k=j;k<n-1;++k)
area2+=v[k].x*v[k+1].y-v[k+1].x*v[k].y;
area2=abs(area2);
if(area!=area1+area2)
continue;
ans.push_back({v[i].ind,v[j].ind});
vector<punct> p1,p2;
p1.clear(),p2.clear();
for(int k=i;k<=j;++k)
p1.push_back(v[k]);
for(int k=0;k<=i;++k)
p2.push_back(v[k]);
for(int k=j;k<n;++k)
p2.push_back(v[k]);
solve(p1);
solve(p2);
return ;
}
}
int main()
{
ios_base::sync_with_stdio(false);
in.tie(0),out.tie(0);
in>>tst;
while(tst--)
{
in>>n;
v.clear();
v.resize(n);
for(int i=0;i<n;++i)
in>>v[i].x>>v[i].y,
v[i].ind=i;
ans.clear();
solve(v);
sort(ans.begin(),ans.end());
for(pii p:ans) out<<p.first<<' '<<p.second<<'\n';
//out<<'\n';
}
return 0;
}