POJ1066——計算幾何

題目描述:

一個人被困在一個正方形迷宮內,周圍有好多牆,牆從正方形邊上的一個點爲起點,到另一個邊上的一點爲終點,牆的中點是一個門。求這個人走出迷宮最少要穿過多少門。

大致思路:

根據題目描述很容易想到用深搜,向四周拓展,但是這樣顯然很複雜而且時間複雜度可能會很低。就換一種思路,不把門想象在中點,而是牆上任意一點,就不難看出來,只要求一下四周的點到人這個位置的連線與多少牆相交了。而且這樣求出來的結果就是最終的答案。

代碼:

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#define eps 1e-6

using namespace std;

int dcmp(double x) {
    if (x < -eps) return -1;
    else return (x > eps);
}

struct Point {
    double x,y;
    Point (double x = 0, double y = 0):x(x),y(y){}
};

int n;
Point l[50][2], pt;

double det(Point p0, Point p1, Point p2) {
    return (p1.x - p0.x)*(p2.y - p0.y) - (p2.x - p0.x)*(p1.y - p0.y);
}

int inter(Point p1, Point p2, Point p3, Point p4) {
    if (max(p1. x, p2. x) + eps < min(p3. x, p4. x) ||
		max(p3. x, p4. x) + eps < min(p1. x, p2. x) ||
		max(p1. y, p2. y) + eps < min(p3. y, p4. y) ||
		max(p3. y, p4. y) + eps < min(p1. y, p2. y)) return 0;
    int d1 = dcmp(det(p3, p4, p2));
	int d2 = dcmp(det(p3, p4, p1));
	int d3 = dcmp(det(p1, p2, p4));
	int d4 = dcmp(det(p1, p2, p3));
	if (d1*d2 == 1 || d3*d4 == 1) return 0;
	if (d1 == 0 && d2 == 0 && d3 == 0 && d4 == 0) return -1;
    return 1;
}

int main() {
    cin>>n;
    for (int i = 0; i < n; i++) {
        scanf("%lf%lf%lf%lf",&l[i][0].x,&l[i][0].y,&l[i][1].x,&l[i][1].y);
    }
    scanf("%lf%lf",&pt.x,&pt.y);
    int ans = 10000,t,j;
	for (double i = 0.5; i < 100; i += 1){
		for (t = 1,j = 0; j < n; j++)
			t += inter(l[j][0], l[j][1], pt, Point(0.0, i));
		ans = min(ans,t);
	}
	for (double i = 0.5; i < 100; i += 1){
		for (t = 1,j = 0; j < n; j++)
			t += inter(l[j][0], l[j][1], pt, Point(i, 0.0));
		ans = min(ans,t);
	}
	for (double i = 0.5; i < 100; i += 1){
		for (t = 1,j = 0; j < n; j++)
			t += inter(l[j][0], l[j][1], pt, Point(i, 100.0));
		ans = min(ans,t);
	}
	for (double i = 0.5; i < 100; i += 1){
		for (t = 1,j = 0; j < n; j++)
			t += inter(l[j][0], l[j][1], pt, Point(100.0, i));
		ans = min(ans,t);
	}
	cout<<"Number of doors = "<<ans<<endl;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章