题目:pku1648 题目大意:看由起始点、结束点组成的线段经过几个100*100的正方形,只要有一个点在该正方形上就算。 解题思路:判断该线段是否与各个正方形相交,如果相交ans++;最后输出结果即可。 代码: //1 <= N <= 100), 0 <= W, E <= 100*N) // If the highway just touches the edge of an estate, it is still considered a crossing. // The highway is a line between points (0, W) and (100*N, E). #include <iostream> using namespace std; const double eps=1e-10; struct point { double x, y; }; double max(double x,double y) { return x>y?x:y; } double min(double x,double y) { return x<y?x:y; } double multi(point p0,point p1,point p2) { return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);} //判断线段相交 bool is_cross(point s1,point e1,point s2,point e2) { return max(s1.x,e1.x)>=min(s2.x,e2.x)&& max(s2.x,e2.x)>=min(s1.x,e1.x)&& max(s1.y,e1.y)>=min(s2.y,e2.y)&& max(s2.y,e2.y)>=min(s1.y,e1.y)&& multi(s2,e1,s1)*multi(e1,e2,s1)>=0&& multi(s1,e2,s2)*multi(e2,e1,s2)>=0; } int main() { int n,w,e,ans; point st,ed,p[4]; while(scanf("%d%d%d",&n,&w,&e)!=EOF) { st.x=0,st.y=w;ed.x=n*100;ed.y=e; int i,j;ans=0; for(i=0;i<n;i++) for(j=0;j<n;j++) { p[0].x=i*100;p[0].y=j*100; p[1].x=i*100;p[1].y=(j+1)*100; p[2].x=(i+1)*100;p[2].y=j*100; p[3].x=(i+1)*100;p[3].y=(j+1)*100; if(is_cross(st,ed,p[0],p[1])||is_cross(st,ed,p[0],p[2]) ||is_cross(st,ed,p[2],p[3])||is_cross(st,ed,p[1],p[3]))ans++; } cout<<ans<<endl; } return 0; }