poj2049 Finding Nemo BFS
2016-08-01 08:51
183 查看
|
先说题意,其实我也是借助了许多工具,才看懂意思。这个题是说Nemo丢了,要从0,0出发去找他,然后因为门很危险,所以不要求路径最短,而是要求经过的门最少。题目给出墙和门的起点、方向和长度,可以自己处理成图。这个题关键是处理成图的过程,有多种方法可以使用。根据方法的不同,处理出来的图也是不一样的,但做法都大同小异。
我的方法是用结构体存下每个位置四个方向分别是什么,然后再跑BFS。要注意,因为需要得到的是最少经过的门数,因此并不是最早跑到的是最小的。这里我在每一步之前进行判断,对每个位置,只有当前门数少于之前储存的门数,才会更新入栈,以此来保证找到重点时门数最少。这个题还有一点坑点,就是虽然迷宫范围只有1-199,但是Nemo的坐标可能不在这个范围内,要特别判断一下,如果不在范围内,直接输出0。下面上我的代码,处理的部分我写的麻烦了不少。
#include <stdio.h>
#include <string.h>
const int INF = 23333333;
struct node
{
int u, d, l, r;
}a[222][222];
struct Move
{
int x, y, door;
}s[222*222*22];
int Min[222][222], minl;
void pri()
{
for (int j = 6; j >= 0; j--)
{
for (int i = 0; i < 7; i++)
printf("%d ", Min[i][j]);
printf("\n");
}
}
void BFS(int x, int y)
{
struct Move now, next;
now.x = x;
now.y = y;
now.door = 0;
int base = 0, top = 0;
Min[now.x][now.y] = 0;
s[top++] = now;
while (base < top)
{
if (a[s[base].x][s[base].y].u != 1)
{
next.x = s[base].x;
next.y = s[base].y + 1;
next.door = s[base].door;
if (a[s[base].x][s[base].y].u == -1)
next.door = s[base].door + 1;
if (next.x>=0&&next.x<200&&next.y>=0&&next.y<200&&Min[next.x][next.y] > next.door)
{
s[top++] = next;
Min[next.x][next.y] = next.door;
}
}
if (a[s[base].x][s[base].y].d != 1)
{
next.x = s[base].x;
next.y = s[base].y - 1;
next.door = s[base].door;
if (a[s[base].x][s[base].y].d == -1)
next.door = s[base].door + 1;
if (next.x>=0&&next.x<200&&next.y>=0&&next.y<200&&Min[next.x][next.y] > next.door)
{
s[top++] = next;
Min[next.x][next.y] = next.door;
}
}
if (a[s[base].x][s[base].y].l != 1)
{
next.x = s[base].x - 1;
next.y = s[base].y;
next.door = s[base].door;
if (a[s[base].x][s[base].y].l == -1)
next.door = s[base].door + 1;
if (next.x>=0&&next.x<200&&next.y>=0&&next.y<200&&Min[next.x][next.y] > next.door)
{
s[top++] = next;
Min[next.x][next.y] = next.door;
}
}
if (a[s[base].x][s[base].y].r != 1)
{
next.x = s[base].x + 1;
next.y = s[base].y;
next.door = s[base].door;
if (a[s[base].x][s[base].y].r == -1)
next.door = s[base].door + 1;
if (next.x>=0&&next.x<200&&next.y>=0&&next.y<200&&Min[next.x][next.y] > next.door)
{
s[top++] = next;
Min[next.x][next.y] = next.door;
}
}
//pri();
base++;
}
}
int main()
{
int i, j, n, m, l;
while (scanf("%d%d", &n, &m), n!=-1||m!=-1)
{
int x, y, k, d;
memset(a, 0, sizeof a);
for (i = 0; i < 222; i++)
for (j = 0; j < 222; j++)
Min[i][j] = INF;
for (i = 0; i < n; i++)
{
scanf("%d%d%d%d", &x, &y, &k, &d);
if (k == 1)
for (l = 0; l < d; l++)
{
a[x-1][y].r = a[x][y].l = 1;
y++;
}
else if (k == 0)
for (l = 0; l < d; l++)
{
a[x][y-1].u = a[x][y].d = 1;
x++;
}
}
for (i = 0; i < m; i++)
{
scanf("%d%d%d", &x, &y, &k);
if (k == 1)
a[x-1][y].r = a[x][y].l = -1;
else if (k == 0)
a[x][y-1].u = a[x][y].d = -1;
}
double xb, yb;
scanf("%lf%lf", &xb, &yb);
if (xb < 0 || xb > 199 || yb < 0 || yb > 199)
printf("0\n");
else
{
BFS(int(xb), int(yb));
//pri();
if (Min[0][0] != INF)
printf("%d\n", Min[0][0]);
else
printf("-1\n");
}
}
return 0;
}
相关文章推荐
- poj2049 Finding Nemo(优先队列BFS)
- 【bfs+优先队列】POJ2049-Finding Nemo
- poj2049(bfs) Finding Nemo
- poj 2049 Finding Nemo(bfs+dij 建图难)
- POJ2049——Finding Nemo
- poj2049 - Finding Nemo
- POJ 2049 Finding Nemo ( BFS)
- Finding Nemo (poj 2049 超级蛋疼的bfs)
- poj2049 Finding Nemo
- Finding Nemo POJ 2049(三维BFS)
- Finding Nemo--BFS
- poj2049 Finding Nemo(建图+BFS+优先队列+特判)
- POJ-2049-Finding Nemo(BFS)
- Finding Nemo(bfs)
- POJ 2049 Finding Nemo 网格bfs
- poj-2049 Finding Nemo-BFS
- poj2049--Finding Nemo
- POJ 2049 Finding Nemo(三维BFS)
- POJ 2049— Finding Nemo(三维BFS)10/200
- poj 2049 Finding Nemo(bfs)