poj 1556 The Doors
程序员文章站
2022-04-02 16:56:42
...
这个题复杂在建图比较难,就是要考虑墙阻碍路径怎么判断?还有就是墙上数据的储存。都是很经典的方法。
对于两点之间是否有路径的判断,就是判断两点之间是否有墙,对墙进行判断,因为两点之间可能有很多墙,所以要记录墙的位置,对于是否阻挡的判断就是判断中间那个墙的两个点位于所求两点的上下位置,同上同下为不阻挡,反之,则阻挡。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<iomanip>
using namespace std;
const int MAXN = 14;
const int MAX = 0x3f3f3f3f;
int cnt,m;
struct Edge
{
int u,v;
double w;
};
Edge e[2000];
struct P
{
double x,y;
int row;
};
P p[100];
double px[MAXN];
double py[20][4];
double dis[100];
bool cross(double x1,double y1,double x2,double y2,double x3,double y3)
{
return (x2 - x1) * (y3 - y1) > (x3 - x1) * (y2 - y1);
}
bool tell(P a,P b)
{
bool flag = 1;
if(a.row == b.row)
return 0;
for(int i = a.row + 1; i <= b.row - 1;++i)
{
if(cross(a.x,a.y,b.x,b.y,px[i],py[i][0]) ^ cross(a.x,a.y,b.x,b.y,px[i],0))
{
flag = 0;
break;
}
if(cross(a.x,a.y,b.x,b.y,px[i],py[i][1]) ^ cross(a.x,a.y,b.x,b.y,px[i],py[i][2]))
{
flag = 0;
break;
}
if(cross(a.x,a.y,b.x,b.y,px[i],py[i][3]) ^ cross(a.x,a.y,b.x,b.y,px[i],10))
{
flag = 0;
break;
}
}
return flag;
}
void bellman_ford(int v0)
{
for(int i = 1; i<= cnt; ++i) // 易错double赋值。
dis[i] = MAX;
dis[v0] = 0;
for(int i = 1; i <= cnt - 1; ++i)
{
for(int j = 1; j <= m; ++j)
{
dis[e[j].v] = min(dis[e[j].u] + e[j].w,dis[e[j].v]);
}
}
return ;
}
double f(P a,P b)
{
double ans;
double x = a.x - b.x;
double y = a.y - b.y;
ans = sqrt(x * x + y * y);
return ans;
}
int main()
{
int n;
while(cin >> n && n != -1)
{
cnt = 1;
p[1].x = 0; p[1].y = 5; p[1].row = 0;
cnt++;
for(int i = 1; i <= n; ++i)
{
cin >> px[i];
for(int j = 0; j <= 3; ++j)
{
cin >> py[i][j];
p[cnt].x = px[i];
p[cnt].y = py[i][j];
p[cnt].row = i;
cnt++;
}
}
p[cnt].x = 10; p[cnt].y = 5; p[cnt].row = cnt / 4 + 1;
m = 1;
for(int i = 1;i <= cnt - 1; ++i)
{
for(int j = i + 1; j <= cnt; ++j)
{
if(tell(p[i],p[j]))
{
e[m].u = i;
e[m].v = j;
e[m].w = f(p[i],p[j]);
m++;
}
}
}
m -= 1;
bellman_ford(1);
cout << fixed << setprecision(2) << dis[cnt] << endl;
}
return 0;
}
总结:对于这个题来说就是,先要建模对问题有个系统的认识,其次就是逻辑思维的推理,以及想象力,对问题的全面考虑,然后就是思维的细化。
推荐阅读
-
kuangbin专题 专题一 简单搜索 棋盘问题 POJ - 1321
-
kuangbin专题 专题一 简单搜索 Prime Path POJ - 3126
-
POJ:1017-Packets(贪心+模拟,神烦)
-
poj1637 Sightseeing tour(混合图欧拉回路)
-
POJ1862 Stripies 贪心 B
-
POJ2431 优先队列+贪心 - biaobiao88
-
POJ3233Matrix Power Series(矩阵快速幂)
-
4 Values whose Sum is 0 POJ - 2785
-
POJ:2393-Yogurtfactory 编程题
-
POJ 2983 M × N Puzzle