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 |
为什么用宏定义判断最大最小值 会出错呢?#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int min(int x, int y){ return x>y ? y : x; } int max(int x, int y){ return x>y ? x : y; } //为什么用下面这个宏定义就错了呢???????? #define mmax(x,y) x>y ? x : y #define mmin(x,y) x<y ? x : y struct P{ int x,y; P(const int _x, const int _y) :x(_x),y(_y) {} P(){} const P& input(){ scanf("%d %d",&x,&y); return *this; } const P& output() const{ printf("%d %d\n",x,y); return *this; } }; int cross(const P &p1, const P &p2, const P &p3){ return (p3.x - p1.x)*(p2.y - p1.y) - (p3.y - p1.y)*(p2.x - p1.x); } bool online(const P &p1, const P &p2, const P &p3, int flag =0){ if(min(p1.x, p2.x) <= p3.x && p3.x <= max(p1.x, p2.x) && min(p1.y, p2.y) <= p3.y && p3.y <= max(p1.y, p2.y)){ // printf("%d %d %d\n",min(p1.x, p2.x),max(p1.x, p2.x),p3.x); // printf("%d %d %d\n",min(p1.y, p2.y),max(p1.y, p2.y),p3.y); return true; } /* if(mmin(p1.x, p2.x) <= p3.x && p3.x <= mmax(p1.x, p2.x) && mmin(p1.y, p2.y) <= p3.y && p3.y <= mmax(p1.y, p2.y)){ // printf("%d %d %d\n",min(p1.x, p2.x),max(p1.x, p2.x),p3.x); // printf("%d %d %d\n",min(p1.y, p2.y),max(p1.y, p2.y),p3.y); return true; }*/ return false; } bool lineInsect(const P &p1, const P &p2, const P &p3, const P &p4){ int d1 = cross(p1, p2, p3); int d2 = cross(p1, p2, p4); int d3 = cross(p3, p4, p1); int d4 = cross(p3, p4, p2); if(d1*d2 < 0 && d3*d4<0) return true; else if(d1 ==0 && online(p1, p2, p3)) return true; else if(d2 ==0 && online(p1, p2, p4)) return true; else if(d3 ==0 && online(p3, p4, p1)) return true; else if(d4 ==0 && online(p3, p4, p2)) return true; return false; } int main(){ P a,b,r1,r2,r3,r4; int tt; //freopen("in.txt","r",stdin); //freopen("out2.txt","w",stdout); scanf("%d",&tt); while(tt--){ scanf("%d%d",&a.x,&a.y); scanf("%d%d",&b.x,&b.y); scanf("%d%d",&r1.x,&r1.y); scanf("%d%d",&r3.x,&r3.y); P tp; if(r1.x > r3.x){ tp = r1; r1 = r3; r3 = tp; } r2 = P(r3.x, r1.y); r4 = P(r1.x, r3.y); // r1.output(); // r2.output(); // r3.output(); // r4.output(); bool isInsect = false; if(lineInsect(a,b,r1,r2)) { isInsect = true; } if(!isInsect && lineInsect(a,b,r2,r3)){ isInsect = true; } if(!isInsect && lineInsect(a,b,r3,r4)){ isInsect = true; } if(!isInsect && lineInsect(a,b,r4,r1)){ isInsect = true; } P tp1, tp2; tp1.x = min(r1.x,r3.x); tp1.y = max(r1.y,r3.y); tp2.x = max(r1.x,r3.x); tp2.y = min(r1.y,r3.y); //printf("%d %d %d %d %d %d\n",r1.x,r1.y,r3.x,r3.y,a.x,a.y); if(tp1.x <= a.x && a.x <= tp2.x && tp2.y <= a.y && a.y <= tp1.y){ isInsect = true; } if(isInsect) printf("T\n"); else printf("F\n"); } return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator