我写的程序到底哪出错了,为什么一直是wrong answer?
#include<iostream>
#include<math.h>
#include<iomanip>
using namespace std;
#define PI 3.1415926
#define Infinity 32767
struct Chimney
{
char shape;
int x;
int y;
};
void Input(int &m,char S1[100],Chimney C[100])
{
int i;
cin>>m;//输入烟囱的数量m(1<=m<=100)
cin>>S1;//输入从左到右烟囱的排列顺序
for(i=0;i<m;i++)
cin>>C[i].shape>>C[i].x>>C[i].y;//输入烟囱的形状、x坐标和y坐标
}
double Intersection(Chimney c1,Chimney c2)//计算两个烟囱的连线与x轴的交点
{
double p;
if(c1.y==c2.y)
p=Infinity;
else
p=(double)(c2.x*c1.y-c1.x*c2.y)/(c1.y-c2.y);
return p;
}
void Intersections(int m,int &pn,Chimney C[100],double P[5000])
{
int i,j,r;//i,j,r为循环变量
double p;
for(i=0;i<m-1;i++)//找出任意两个烟囱连线与x轴的交点,交点不重复,计算交点个数
for(j=i+1;j<m;j++)
{
p=Intersection(C[i],C[j]);
for(r=0;r<pn;r++)
if(P[r]==p)
break;
if(r==pn&&p!=Infinity)
P[pn++]=p;
}
for(i=0;i<pn-1;i++)//从小到大记录所有交点
for(j=i+1;j<pn;j++)
if(P[i]>P[j])
{
p=P[i];
P[i]=P[j];
P[j]=p;
}
}
void Compare(int m,int &n,int pn,Chimney C[100],double P[5000],char S1[100],double Intervals[10000])
{
int i,j,r;//i,j,r为循环变量
double X;//X表示Nick所在位置
double angle[100],A,T;//angle表示角度,T表示斜率
struct Chimney temp;
char S2[100];//表示从(X,0)看到的顺序
for(i=0;i<=pn;i++)
{
if(i==0)
X=P[i]-0.000001;
else
X=P[i-1]+0.000001;
for(j=0;j<m;j++)//求出所有烟囱与(X,0)点连线的倾角
{
if(X==C[j].x)
angle[j]=PI;
else
{
T=(double)C[j].y/(C[j].x-X);
angle[j]=atan(T);
if(angle[j]<0)
angle[j]+=PI;
}
}
for(j=0;j<m-1;j++)//倾角排序(由大到小)
for(r=j+1;r<m;r++)
if(angle[j]<angle[r])
{
A=angle[j];
angle[j]=angle[r];
angle[r]=A;
temp=C[j];
C[j]=C[r];
C[r]=temp;
}
for(j=0;j<m;j++)//比较S1和S2
{
S2[j]=C[j].shape;
if(S2[j]!=S1[j])
break;
}
if(j==m)//Nick可能在(X,0)处,记录X所在区间
{
if(i==0)
{
Intervals[0]=Infinity;
Intervals[1]=P[0];
}
else if(i==pn)
{
Intervals[2*n]=P[pn-1];
Intervals[2*n+1]=Infinity;
}
else
{
Intervals[2*n]=P[i-1];
Intervals[2*n+1]=P[i];
}
n++;
}
}
}
void Output(int n,double Intervals[10000])
{
int i;
cout<<n<<endl;//输出区间数n
for(i=0;i<2*n;i++)
{
if(Intervals[i]==Infinity)
cout<<"* ";
else
cout<<setprecision(7)<<Intervals[i]<<' ';
}
}
int main()
{
int m,n=0;//m为烟囱数,n为区间数
int pn=0;//pn为交点数
struct Chimney C[100];//为所有烟囱的记录
char S1[100];//S1表示Nick看到的烟囱的顺序
double P[5000];//交点
double Intervals[10000];//Intervals记录区间的两端点
Input(m,S1,C);
Intersections(m,pn,C,P);
Compare(m,n,pn,C,P,S1,Intervals);
Output(n,Intervals);
return 0;
}