简单枚举,题意就是枚举一条直线,将点平分到直线两边,但都必须在蛋糕上。答案有多中。
#include<iostream>
#include<stdio.h>
#include<cmath>
using namespace std;
typedef struct zuobiao
{
int x,y;
} Point;
Point p[110];
void c(int t)
{
int a,b;
for(a=-500; a<=500; a++)
for(b=-500; b<=500; b++)
{
int left=0,right=0;
for(int i=0; i<2*t; i++)
{
int x=a*p[i].x+b*p[i].y;
if(x>0)left++;
else if(x<0)right++;
else break;
if(left==right&&left==t)
{
cout<<a<<" "<<b<<endl;
return;
}
}
}
}
int main()
{
int t;
while(cin>>t,t)
{
t*=2;
int p_num=0;
for(int i=0; i<t; i++)
cin>>p[i].x>>p[i].y;
for(int i=0; i<t; i++)
{
if(p[i].x>=100||p[i].x<=-100||p[i].y<=-100||p[i].y>=100)
continue;
p[p_num++]=p[i];
}
t=p_num/2;
c(t);
}
return 0;
}
还有一种随机数的方法。
#include<iostream>
#include<stdio.h>
#include<cstdlib>
#include<ctime>
#include<cmath>
using namespace std;
typedef struct zuobiao
{
int x,y;
} Point;
Point p[110];
void c(int t)
{
srand((unsigned)time(NULL));
while(1)
{
int a=-500+rand()%1001,b=-500+rand()%1001;
int left=0,right=0;
for(int i=0; i<2*t; i++)
{
int x=a*p[i].x+b*p[i].y;
if(x>0)left++;
else if(x<0)right++;
else break;
if(left==right&&left==t)
{
cout<<a<<" "<<b<<endl;
return;
}
}
}
}
int main()
{
int t;
while(cin>>t,t)
{
t*=2;
int p_num=0;
for(int i=0; i<t; i++)
cin>>p[i].x>>p[i].y;
for(int i=0; i<t; i++)
{
if(p[i].x>=100||p[i].x<=-100||p[i].y<=-100||p[i].y>=100)
continue;
p[p_num++]=p[i];
}
t=p_num/2;
c(t);
}
return 0;
}