pku 2049 Finding Nemo 第一周训练——搜索

http://poj.org/problem?id=2049

好纠结的一道题,刚拿过体来就已经懵了。这个图的信息到底该怎么存啊。。。纠结。看了别人的思路才A的。。

he,ve两个数组分别存放这平行于x轴,y轴的墙,门信息。。。

dis存储到达该点的最端距离。

View Code
#include <cstdio>
#include <cstring>
#include <queue>
#define maxn 250
#define inf 999999999
using namespace std;
struct node//优先队列的写法
{
int x,y;
int len;
bool operator < (const node &a) const
{
return len > a.len;
}
};
int n,m,sx,sy;
int dis[maxn][maxn],he[maxn][maxn],ve[maxn][maxn];
priority_queue<node>q;
int xmax,ymax;
void bfs()
{
int x,y;
for (x = 0; x <= xmax; ++x)
{
for (y = 0; y <= ymax; ++y)
dis[x][y] = inf;
}
while (!q.empty()) q.pop();
node pn;
pn.x = 0; pn.y = 0; pn.len = 0;
dis[0][0] = 0;
q.push(pn);
while (!q.empty())
{
pn = q.top();
q.pop();
x = pn.x; y = pn.y;
if (x == sx && y == sy) return ;
//向上走
if (y + 1 <= ymax && dis[x][y + 1] > dis[x][y] + he[x][y + 1])
{
dis[x][y + 1] = dis[x][y] + he[x][y + 1];
pn.x = x; pn.y = y + 1; pn.len = dis[x][y + 1];
q.push(pn);
}
//向下走
if (y - 1 >= 0 && dis[x][y - 1] > dis[x][y] + he[x][y])
{
dis[x][y - 1] = dis[x][y] + he[x][y];
pn.x = x; pn.y = y - 1; pn.len = dis[x][y - 1];
q.push(pn);
}
//向左走
if (x - 1 >= 0 && dis[x - 1][y] > dis[x][y] + ve[x][y])
{
dis[x - 1][y] = dis[x][y] + ve[x][y];
pn.x = x - 1; pn.y = y; pn.len = dis[x - 1][y];
q.push(pn);
}
//向右走
if (x + 1 <= xmax && dis[x + 1][y] > dis[x][y] + ve[x + 1][y])
{
dis[x + 1][y] = dis[x][y] + ve[x + 1][y];
pn.x = x + 1; pn.y = y; pn.len = dis[x + 1][y];
q.push(pn);
}
}
dis[sx][sy] = -1;
}
int main()
{
int x,y,d,t,i,j;
double tx,ty;
while (scanf("%d%d",&n,&m))
{
xmax = ymax = - 1;//记录最大x,与y
memset(he,0,sizeof(he));
memset(ve,0,sizeof(ve));
if (n == -1 && m == -1) break;
for (i = 0; i < n; ++i)
{
scanf("%d%d%d%d",&x,&y,&d,&t);
if (d == 0)
{
for (j = 0; j < t; ++j)
he[x + j][y] = inf;
xmax = max(xmax,x + t);
ymax = max(ymax,y);
}
else
{
for (j = 0; j < t; ++j)
ve[x][y + j] = inf;
xmax = max(xmax,x);
ymax = max(ymax,y + t);
}
}
for (i = 0; i < m; ++i)
{
scanf("%d%d%d",&x,&y,&d);
if (d == 0)
{
he[x][y] = 1;
}
else
{
ve[x][y] = 1;
}
}
scanf("%lf%lf",&tx,&ty);
if (tx > xmax || ty > ymax)
{
puts("0");
}
else
{
sx = (int)tx;
sy = (int)ty;
bfs();
printf("%d\n",dis[sx][sy]);
}
}
return 0;
}



你可能感兴趣的:(find)