Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
帮顶In Reply To:终于过了....这道题WA的很诡异!!WA的兄弟近来看看 Posted by:humanjustic at 2006-11-17 21:41:51 > WA的原因: > (1)没有考虑到两圆内含的情况!! > 所以在判断 两圆心点距离dis 和 两圆半径关系时,有两种情况要同时考虑: > dis< (r1+r2) && dis>(float)fabs(r1-r2) 这时才是真正的相交!! > (2)没有考虑两圆重合情况!! > > 但是我自己一开始WA的时候并不是由于没有考虑到上面情况WA的. > 而是在用库函数memset()导致WA,这个情况很诡异.. > 下面有AC和WA的代码: > > 这个是用了库函数memset()导致WA的: > #include <iostream> > #include <cmath> > #define Max 1000000 > using namespace std; > > struct Node > { > double x,y,r; > }*data; > > bool *visit; > short Queuen[Max]; > int N,f,l; > > void readdata() > { > int i; > > data=new Node [N+1]; > > for(i=1;i<=N;i++){ > cin>>data[i].x>>data[i].y>>data[i].r; > } > f=l=0; > } > > bool connect(short id1,short id2) > { > double dis; > dis=(double)sqrt( (data[id1].x-data[id2].x)*(data[id1].x-data[id2].x) > +(data[id1].y-data[id2].y)*(data[id1].y-data[id2].y) ); > > if(dis<(data[id1].r+data[id2].r)&&dis>(double)fabs(data[id1].r-data[id2].r)) return true; > else if( (double)fabs(data[id1].x-data[id2].x)<=0.00000001 > &&(double)fabs(data[id1].y-data[id2].y)<=0.00000001 > &&(double)fabs(data[id1].r-data[id2].r)<=0.00000001) > return true; > return false; > } > > int BFS() > { > visit = new bool [N+1]; > //这里,本来想用memset()赋初值的,可是会错 > memset(visit,0,sizeof(visit)); > int Count=1,i; > short Id; > > while(f<l&&l<Max){ > Id=Queuen[f++]; > visit[Id]=true; > > for(i=1;i<=N;i++){ > if(!visit[i]){ > if(connect(Id,i)){ > visit[i]=true; > Queuen[l++]=i; > Count++; > } > } > } > } > delete visit; > return Count; > } > > int main() > { > while(cin>>N){ > if(N==-1) break; > > readdata(); > int best=0,tmp; > for(int i=1;i<=N;i++){ > f=l=0; > Queuen[l++]=i; > tmp=BFS(); > if(tmp>best) best=tmp; > } > > cout<<"The largest component contains "<<best<<" rings"<<endl; > } > return 0; > } > > 下面是AC的: > #include <iostream> > #include <cmath> > #define Max 1000000 > using namespace std; > > struct Node > { > double x,y,r; > }*data; > > bool *visit; > short Queuen[Max]; > int N,f,l; > > void readdata() > { > int i; > > data=new Node [N+1]; > > for(i=1;i<=N;i++){ > cin>>data[i].x>>data[i].y>>data[i].r; > } > f=l=0; > } > > bool connect(short id1,short id2) > { > double dis; > dis=(double)sqrt( (data[id1].x-data[id2].x)*(data[id1].x-data[id2].x) > +(data[id1].y-data[id2].y)*(data[id1].y-data[id2].y) ); > > if(dis<(data[id1].r+data[id2].r)&&dis>(double)fabs(data[id1].r-data[id2].r)) return true; > else if( (double)fabs(data[id1].x-data[id2].x)<=0.00000001 > &&(double)fabs(data[id1].y-data[id2].y)<=0.00000001 > &&(double)fabs(data[id1].r-data[id2].r)<=0.00000001) > return true; > return false; > } > > int BFS() > { > visit = new bool [N+1]; > //memset(visit,0,sizeof(visit));//把这个去了 > int Count=1,i; > short Id; > //换for循环来赋初值..就没事!!!相当怪异!!! > for(i=1;i<=N;i++) > visit[i]=false; > > while(f<l&&l<Max){ > Id=Queuen[f++]; > visit[Id]=true; > > for(i=1;i<=N;i++){ > if(!visit[i]){ > if(connect(Id,i)){ > visit[i]=true; > Queuen[l++]=i; > Count++; > } > } > } > } > delete visit; > return Count; > } > > int main() > { > while(cin>>N){ > if(N==-1) break; > > readdata(); > int best=0,tmp; > for(int i=1;i<=N;i++){ > f=l=0; > Queuen[l++]=i; > tmp=BFS(); > if(tmp>best) best=tmp; > } > > cout<<"The largest component contains "<<best<<" rings"<<endl; > } > return 0; > } > Problem Id:3025 User Id:humanjustic > Memory:100K Time:0MS > Language:C++ Result:Accepted > > 希望高手指点一下..memset()的具体用法..真是搞不懂!! > Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator