這題我就是用最原始的思考方法,其中有許多細節要注意。主體思想就是四條邊分別和線段比較。
線段在矩形內要考慮。
我的代碼有點亂有點長,其中有的部分可以寫成函數。
#include#include #include #include using namespace std; int x_s,y_s,x_e,y_e,x_l,y_t,x_r,y_b; bool f1(int x) { return x>=x_l&&x<=x_r; } bool f2(int y) { return y>=y_b&&y<=y_t; } bool judge(int x) { return (x>=x_s&&x<=x_e)||(x>=x_e&&x<=x_s); } bool judge1(int y) { return (y>=y_s&&y<=y_e)||(y>=y_e&&y<=y_s); } bool judge_y(double y) { return y>=(double)y_b&&y<=(double)y_t; } bool judge_x(double x) { return x>=(double)x_l&&x<=(double)x_r; } void _swap(int &a,int &b) { if(a>b) { int t=a; a=b,b=t; } } int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d%d%d%d%d%d%d%d",&x_s,&y_s,&x_e,&y_e,&x_l,&y_t,&x_r,&y_b); _swap(x_l,x_r);//這裡要注意大小問題,題目中說了不是按順序給的 _swap(y_b,y_t); int a1=x_s,b1=y_s,a2=x_e,b2=y_e; _swap(a1,a2); _swap(b1,b2); if(f1(x_s)&&f1(x_e)&&f2(y_s)&&f2(y_e)) { printf("T\n"); continue; } if(x_s==x_e)//考慮斜率不存在 { if(f1(x_s)) if(f2(y_s)||f2(y_e)||(b1<=y_b&&b2>=y_t)) { printf("T\n"); continue; } } if(y_s==y_e)//考慮斜率為0 { if(f2(y_s)) if(f1(x_s)||f1(x_e)||(a1<=x_l&&a2>=x_r)) { printf("T\n"); continue; } } double k=(y_s-y_e)*1.0/(x_s-x_e); double b=y_s*1.0-k*x_s; if(judge(x_l)) { double y=k*x_l+b; if(judge_y(y)) { printf("T\n"); continue; } } if(judge(x_r)) { double y=k*x_r+b; if(judge_y(y)) { printf("T\n"); continue; } } if(judge1(y_b)) { double x=(y_b*1.0-b)/k; if(judge_x(x)) { printf("T\n"); continue; } } if(judge1(y_t)) { double x=(y_t*1.0-b)/k; if(judge_x(x)) { printf("T\n"); continue; } } printf("F\n"); } return 0; }