题意:求出刚好装N个可以相互覆盖的圆形的长方形 然后用给定的够大的长方形减去它 得到 ans 整个题目用到了几何方面的知识 belong()函数就是很好的例子 而DFS()需要非常好的递归思想 #include<iostream> #define MAX 105 using namespace std; typedef struct point { int x1,y1,x2,y2; }; point p[MAX]; int used[MAX]; int n; int belong(int i,int j) { /* if(p[i].x1>p[j].x1&&p[i].x1<p[j].x2&&!(p[i].y1<p[j].y1||p[i].y1>p[j].y2)) return 1; if(p[j].x1>p[i].x1&&p[j].x1<p[i].x2&&!(p[j].y1<p[i].y1||p[j].y1>p[i].y2)) return 1; 仔细琢磨下为什么*/ if(p[i].x2 >= p[j].x1 && p[i].x2 <= p[j].x2 && p[i].y1<=p[j].y2&&p[i].y2>=p[j].y1) return 1; if(p[j].x2 >= p[i].x1 && p[j].x2 <= p[i].x2 && !(p[j].y1 > p[i].y2 || p[j].y2 < p[i].y1)) return 1; return 0; } void DFS(int i,int j) { used[j]=1; if(p[i].x1>p[j].x1) p[i].x1=p[j].x1; if(p[i].y1>p[j].y1) p[i].y1=p[j].y1; if(p[i].x2<p[j].x2) p[i].x2=p[j].x2; if(p[i].y2<p[j].y2) p[i].y2=p[j].y2; for(int k=1;k<=n;k++)//???????????? { if(used[k]||k==i||k==j) continue; if(belong(i,k)) DFS(i,k); } } int main() { int x,y,i,j,k,a,b,r; while(cin>>x>>y>>n) { for(i=1;i<=n;i++) { cin>>a>>b>>r; if(r==0) used[i]=1; else used[i]=0; p[i].x1=a-r; p[i].y1=b-r; p[i].x2=a+r; p[i].y2=b+r; } for(i=1;i<=n;i++) { if(used[i]) continue; for(j=i+1;j<=n;j++) { if(used[j]) continue; if(belong(i,j)) DFS(i,j); } } int ans=0; for(i=1;i<=n;i++) { if(used[i]) continue; ans+=(p[i].x2-p[i].x1)*(p[i].y2-p[i].y1); } cout<<x*y-ans<<endl; } return 0; } http://acm.pku.edu.cn/JudgeOnline/problem?id=1899