我写的程序到底哪出错了,为什么一直是wrong answer?

yks9991 2012-07-12 11:50:39
#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;
}

...全文
428 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
hen_hao_ji 2012-07-24
  • 打赏
  • 举报
回复
网上搜下别人的解题报告看下
kingdom_0 2012-07-24
  • 打赏
  • 举报
回复
自己调试吧。
baichi4141 2012-07-24
  • 打赏
  • 举报
回复
ACM题需要考虑特殊数据和极限数据
gongxujun 2012-07-24
  • 打赏
  • 举报
回复
设断点,看具体值吧
tongzhipeng5699 2012-07-12
  • 打赏
  • 举报
回复
VS编译器 F9打断点,F10 F11两种单步方式。
然后再界面中可以看到变量的值得变化,等等。
wsxxiaohao 2012-07-12
  • 打赏
  • 举报
回复
都没有题目的地址,楼主还是自己去调试吧。参考ACM里面的讨论。
moou00 2012-07-12
  • 打赏
  • 举报
回复
代码太长了,自己f9慢慢调试吧
tzg_dzq 2012-07-12
  • 打赏
  • 举报
回复
调试方法:
1:设断点
2:分段调试,即注释一些语句,依次排除语句错误
3:去函数调试,即去掉一些函数,一个函数一个函数调试
4:单独调试函数,即注释掉函数内部所有语句,看函数调用是否正确
5:变量值是否正确,变量地址是否正确

65,193

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧