思路:
枚举2^3个点,再暴力查找。
pascal:
var n,i,j,k,l,tot:longint;
a,b:array[0..100000] of longint;
x1,y1,x2,y2,x3,y3:longint;
bz:array[0..100000] of boolean;
procedure qsort1(l,r:longint);
var i,j,mid:longint;
begin
i:=l;
j:=r;
mid:=a[(i+j) div 2];
while i<=j do
begin
while a[i]<mid do inc(i);
while a[j]>mid do dec(j);
if i<=j then
begin
a[0]:=a[i];
a[i]:=a[j];
a[j]:=a[0];
b[0]:=b[i];
b[i]:=b[j];
b[j]:=b[0];
inc(i);
dec(j);
end;
end;
if i<r then qsort1(i,r);
if l<j then qsort1(l,j);
end;
procedure qsort2(l,r:longint);
var i,j,mid:longint;
begin
i:=l;
j:=r;
mid:=b[(i+j) div 2];
while i<=j do
begin
while b[i]<mid do inc(i);
while b[j]>mid do dec(j);
if i<=j then
begin
a[0]:=a[i];
a[i]:=a[j];
a[j]:=a[0];
b[0]:=b[i];
b[i]:=b[j];
b[j]:=b[0];
inc(i);
dec(j);
end;
end;
if i<r then qsort2(i,r);
if l<j then qsort2(l,j);
end;
procedure pd();
var i,j:longint;
begin
j:=0;
for i:=1 to n do
begin
if (x1=a[i])or(x2=a[i])or(x3=a[i])or(y1=b[i])or(y2=b[i])or(y3=b[i]) then
begin
inc(j);
end
else
exit();
end;
if j=n then
begin
writeln(1);
halt;
end;
end;
begin
readln(n);
for i:=1 to n do readln(a[i],b[i]);
qsort1(1,n);
tot:=1;
for i:=1 to n do
begin
if a[i+1]>a[tot] then
begin
qsort2(tot,i);
tot:=i+1;
end;
end;
for i:=1 to 1 do
begin
fillchar(bz,sizeof(bz),false);
x1:=a[i];
for j:=i+1 to n do
begin
if a[j]<>x1 then
begin
x2:=a[j];
for k:=j+1 to n do
begin
if (a[k]<>x1)and(a[k]<>x2) then
begin
x3:=a[k];
pd();
x3:=-1;
y3:=b[k];
pd();
y3:=-1;
break;
end;
end;
x2:=-1;
y2:=b[j];
for k:=j+1 to n do
begin
if (a[k]<>x1)and(b[k]<>y2) then
begin
x3:=a[k];
pd();
x3:=-1;
y3:=b[k];
pd();
y3:=-1;
break;
end;
end;
y2:=-1;
break;
end;
end;
x1:=-1;
y1:=b[i];
for j:=i+1 to n do
begin
if b[j]<>y1 then
begin
x2:=a[j];
for k:=j+1 to n do
begin
if (b[k]<>y1)and(a[k]<>x2) then
begin
x3:=a[k];
pd();
x3:=-1;
y3:=b[k];
pd();
y3:=-1;
break;
end;
end;
x2:=-1;
y2:=b[j];
for k:=j+1 to n do
begin
if (b[k]<>y1)and(b[k]<>y2) then
begin
x3:=a[k];
pd();
x3:=-1;
y3:=b[k];
pd();
y3:=-1;
break;
end;
end;
y2:=-1;
break;
end;
end;
y1:=-1;
end;
writeln(0);
end.
C++:
#include<cstdio>
#include<cstring>
using namespace std;
int n;
bool bk=false;
struct no
{
int x,y;
no()
{
x=-100;
y=-100;
}
}a[50010];
int x[5][2];
bool b=true;
bool c[50010];
void work(int k)
{
if(k>3)
{
b=true;
bool b2;
for(int i=1;i<=n;i++)
{
b2=false;
for(int j=1;j<k;j++)
{
if((x[j][0]==1&&a[i].x==x[j][1])||(x[j][0]==2&&a[i].y==x[j][1]))
{
b2=true;
}
}
if(!b2)
b=false;
}
if(b)
bk=true;
}
else
{
int i=1;
while(1)
{
b=true;
for(int j=1;j<k;j++)
{
if((x[j][0]==1&&a[i].x==x[j][1])||(x[j][0]==2&&a[i].y==x[j][1]))
{
b=false;
}
}
if(b==true)
break;
else
i++;
}
if(i<=n)
{
x[k][0]=1;
x[k][1]=a[i].x;
work(k+1);
x[k][0]=2;
x[k][1]=a[i].y;
work(k+1);
}
else
{
x[k][0]=0;
work(k+1);
}
}
}
int main()
{
memset(c,0,sizeof(c));
scanf("%d",&n);
if(n<=3)
{
printf("%d",1);
}
else
{
for(int i=1;i<=n;i++)
scanf("%d%d",&a[i].x,&a[i].y);
work(1);
if(bk)
printf("%d",1);
else
printf("%d",0);
}
return 0;
}