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 |
终于过了....这道题WA的很诡异!!WA的兄弟近来看看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