Finding Nemo
Time Limit: 2000MS   Memory Limit: 30000K
Total Submissions: 6952   Accepted: 1584

Description

Nemo is a naughty boy. One day he went into the deep sea all by himself. Unfortunately, he became lost and couldn't find his way home. Therefore, he sent a signal to his father, Marlin, to ask for help. 
After checking the map, Marlin found that the sea is like a labyrinth with walls and doors. All the walls are parallel to the X-axis or to the Y-axis. The thickness of the walls are assumed to be zero. 
All the doors are opened on the walls and have a length of 1. Marlin cannot go through a wall unless there is a door on the wall. Because going through a door is dangerous (there may be some virulent medusas near the doors), Marlin wants to go through as few doors as he could to find Nemo. 
Figure-1 shows an example of the labyrinth and the path Marlin went through to find Nemo. 

We assume Marlin's initial position is at (0, 0). Given the position of Nemo and the configuration of walls and doors, please write a program to calculate the minimum number of doors Marlin has to go through in order to reach Nemo.

Input

The input consists of several test cases. Each test case is started by two non-negative integers M and N. M represents the number of walls in the labyrinth and N represents the number of doors. 
Then follow M lines, each containing four integers that describe a wall in the following format: 
x y d t 
(x, y) indicates the lower-left point of the wall, d is the direction of the wall -- 0 means it's parallel to the X-axis and 1 means that it's parallel to the Y-axis, and t gives the length of the wall. 
The coordinates of two ends of any wall will be in the range of [1,199]. 
Then there are N lines that give the description of the doors: 
x y d 
x, y, d have the same meaning as the walls. As the doors have fixed length of 1, t is omitted. 
The last line of each case contains two positive float numbers: 
f1 f2 
(f1, f2) gives the position of Nemo. And it will not lie within any wall or door. 
A test case of M = -1 and N = -1 indicates the end of input, and should not be processed.

Output

For each test case, in a separate line, please output the minimum number of doors Marlin has to go through in order to rescue his son. If he can't reach Nemo, output -1.

Sample Input

8 9
1 1 1 3
2 1 1 3
3 1 1 3
4 1 1 3
1 1 0 3
1 2 0 3
1 3 0 3
1 4 0 3
2 1 1
2 2 1
2 3 1
3 1 1
3 2 1
3 3 1
1 2 0
3 3 0
4 3 1
1.5 1.5
4 0
1 1 0 1
1 1 1 1
2 1 1 1
1 2 0 1
1.5 1.7
-1 -1

Sample Output

5
-1
 #include <stdio.h>
#include <string.h>
#include <queue>
using namespace std; struct block
{
int x, y, door;
bool operator<(struct block b)const
{
return door > b.door;
}
};
priority_queue<struct block>q; int wall[][];
bool vis[][];
int end_x, end_y; int bfs()
{
while(!q.empty())q.pop();
q.push((struct block){end_x, end_y, });
vis[end_x][end_y] = ;
while(!q.empty())
{
struct block u = q.top();
q.pop();
if(u.x == && u.y == )
return u.door; if(wall[u.x-][u.y] != && !vis[u.x-][u.y])
{
vis[u.x-][u.y] = ;
if(wall[u.x-][u.y] == )
q.push((struct block){u.x-, u.y, u.door+});
else q.push((struct block){u.x-, u.y, u.door});
} if(wall[u.x+][u.y] != && !vis[u.x+][u.y])
{
vis[u.x+][u.y] = ;
if(wall[u.x+][u.y] == )
q.push((struct block){u.x+, u.y, u.door+});
else q.push((struct block){u.x+, u.y, u.door});
} if(wall[u.x][u.y-] != && !vis[u.x][u.y-])
{
vis[u.x][u.y-] = ;
if(wall[u.x][u.y-] == )
q.push((struct block){u.x, u.y-, u.door+});
else q.push((struct block){u.x, u.y-, u.door});
} if(wall[u.x][u.y+] != && !vis[u.x][u.y+])
{
vis[u.x][u.y+] = ;
if(wall[u.x][u.y+] == )
q.push((struct block){u.x, u.y+, u.door+});
else q.push((struct block){u.x, u.y+, u.door});
}
}
return -;
} int main()
{
int n, m, x, y, d, t;
while(scanf("%d %d", &n, &m) != EOF)
{
if(n == - && m == -)break;
memset(wall, , sizeof(wall));
memset(vis, , sizeof(vis));
for(int i = ; i < n; i++)
{
scanf("%d %d %d %d", &x, &y, &d, &t);
if(d == )
{
for(int i = y*; i <= (y+t)*; i++)
wall[x*][i] = ;
}
else
{
for(int i = x*; i <= (x+t)*; i++)
wall[i][y*] = ;
}
}
for(int i = ; i < m; i++)
{
scanf("%d %d %d", &x, &y, &d);
if(d == )
wall[x*][y*+] = ;
else wall[x*+][y*] = ;
}
double x_tmp, y_tmp;
scanf("%lf %lf", &x_tmp, &y_tmp);
if(x_tmp < || x_tmp > || y_tmp < || y_tmp > )
printf("0\n");
else
{
end_x = (int)x_tmp * + ;
end_y = (int)y_tmp * + ;
for(int i = ; i <= ; i++)
wall[][i] = wall[i][] = wall[][i] = wall[i][] = ;
printf("%d\n", bfs());
}
}
return ;
}

POJ 2049 Finding Nemo bfs 建图很难。。的更多相关文章

  1. POJ 2049— Finding Nemo(三维BFS)10/200

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u013497151/article/details/29562915 海底总动员.... 这个题開始 ...

  2. POJ 2049 Finding Nemo

    Finding Nemo Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 8631   Accepted: 2019 Desc ...

  3. poj 3026 Borg Maze bfs建图+最小生成树

    题目说从S开始,在S或者A的地方可以分裂前进. 想一想后发现就是求一颗最小生成树. 首先bfs预处理得到每两点之间的距离,我的程序用map做了一个映射,将每个点的坐标映射到1-n上,这样建图比较方便. ...

  4. poj 2049 Finding Nemo(优先队列+bfs)

    题目:http://poj.org/problem?id=2049 题意: 有一个迷宫,在迷宫中有墙与门 有m道墙,每一道墙表示为(x,y,d,t)x,y表示墙的起始坐标d为0即向右t个单位,都是墙d ...

  5. TTTTTTTTTTTTTTTTTT POJ 2724 奶酪消毒机 二分匹配 建图 比较难想

    Purifying Machine Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 5004   Accepted: 1444 ...

  6. POJ 3687 Labeling Balls 逆向建图,拓扑排序

    题目链接: http://poj.org/problem?id=3687 要逆向建图,输入的时候要判重边,找入度为0的点的时候要从大到小循环,尽量让编号大的先入栈,输出的时候注意按编号的顺序输出重量, ...

  7. BZOJ 4242 水壶(BFS建图+最小生成树+树上倍增)

    题意 JOI君所居住的IOI市以一年四季都十分炎热著称. IOI市是一个被分成纵H*横W块区域的长方形,每个区域都是建筑物.原野.墙壁之一.建筑物的区域有P个,编号为1...P. JOI君只能进入建筑 ...

  8. poj 3678 Katu Puzzle 2-SAT 建图入门

    Description Katu Puzzle is presented as a directed graph G(V, E) with each edge e(a, b) labeled by a ...

  9. POJ2195费用流+BFS建图

    题意:       给你一个n*m的地图,上面有w个人,和w个房子,每个人都要进房子,每个房子只能进一个人,问所有人都进房子的路径总和最少是多少? 思路:       比较简单的最大流,直接建立两排, ...

随机推荐

  1. Java工作队列和线程池

    背景    最近的需要做一个与设备通信的web项目.当然,我们需要写好与设备之间的通信协议(socket).大致的时序逻辑时:当用户用浏览器点击页面某一控件后,它就向后台发送一个post请求,后台解析 ...

  2. Visual Studio Package 插件开发

    背景 这段时间公司新做了一个支付系统,里面有N个后台服务,每次有更新修改,拷贝打包发布包"不亦乐乎"...于是我想要不要自己定制个打包插件. 部分朋友可能会认为,有现成的可以去找一 ...

  3. 手动安装 mysqldb 与[ pip easy_install]

    mysqldb下载: http://sourceforge.net/projects/mysql-python/ https://sourceforge.net/projects/mysql-pyth ...

  4. 使用Socket模拟一个简单的Webservice调用

    webservice是对socket的一个封装,让远程调用调用变得更加简单,那么使用socket究竟有多么麻烦呢?来看看. 做一个简单的天气查询: 服务端: public class SocketSe ...

  5. yo bootstrap mui 使用对比

    昨天晚上 又被问及职业发展方向,提及我的老本行css,切了几年的页面,近两年投入进css的时间屈指可数,被问及之前公司用的yo框架 对比业界内其他css 框架的优势. 1. yo模块化,碎片化  可自 ...

  6. angularjs ng-repeat checkbox

    <div class="col-md-3" ng-repeat="user in title.UserList"> <p class=&quo ...

  7. 升级mac的java版本

    在OS X EI Capitan下, java版本太低,从oracle官网下载的dmg文件升级一直有问题, 我发现mac下的java环境有三处 #这应该是系统自带java环境,默认/usr/bin/j ...

  8. python socket 模拟tcp通讯

    对于tcp server 端的创建而言, 分为如下步骤:   1,创建socket对象(socket):其中俩个参数分别为     Address Family(如AF_INET为ipv4),AF_I ...

  9. Struts2,Hibernate和Spring之间的框架整合关系

    1.首先要认清,hibernate和struts没有半点关系,所以他们之间没有任何可以整合的东西.a:struts 作为中心控制器,肯定要调用一些类来完成一些逻辑.而hibernate开发中,经常使用 ...

  10. 一个操作Sql2005数据库的类(备份,还原,分离,附加,添加删除用户等操作)(转载)

    /* * 更新时间 :2011-09-01 16:06 * 更 新 人 :苏飞 */ using System; using System.Collections.Generic; using Sys ...