题目描述
解题思路
1.对于输入的坐标点使用最大数组保存。
2.对于判断A、B类点,首先根据第一个点的类别,设置分类的flag,那么对另一个类别就是对立的flag值,而设置flag的操作时原子操作,需要一次性完成。
3.对于分类的依据,是数学中的点与直线的关系,点在直线上,则带入点的坐标与直线的三个参数计算结果为0;点在直线上方则带入点的坐标与直线的三个参数计算结果大于0;点在直线的下方则带入点的坐标与直线的三个参数计算结果小于0.
源代码
#includeint main(){
int m,n;
int k0,k1,k2; //每个直线的三个参数
char result[21] ; //保存结果的指针,可以使用数组,但是为了优化空间
int x[1001],y[1001]; //每个坐标的三个x与y值
char c[1001]; //每个坐标的类别
int i,j;
short flagA,flagB,flagR,flag;
scanf("%d%d",&m,&n);
for(i=0;i0){ //A类坐标位于直线上方
if(i==0){
flagA=1;
flagB=0;
}
else{
if(flagA == 0 && flagR == 0){
result[j]='N';
flagR=1;
break;
}
}
}
else{ //A类坐标位于直线下方
if(i==0){
flagA=0;
flagB=1;
}
else{
if(flagA == 1 && flagR == 0){
result[j]='N';
flagR=1;
break;
}
}
}
}
else{//坐标标志为B
if(k0+k1*x[i]+k2*y[i] > 0){ //B类坐标位于直线上方
if(i==0){
flagA=0;
flagB=1;
}
else{
if(flagB == 0 && flagR == 0){
result[j]='N';
flagR=1;
break;
}
}
}
else{ //B类坐标位于直线下方
if(i==0){
flagA=1;
flagB=0;
}
else{
if(flagB == 1 && flagR == 0){
result[j]='N';
flagR=1;
break;
}
}
}
}
}
if(flag==0 && flagR==0){
result[j]='Y';
}
}
for(j=0;j
运行结果