Finding Nemo
Time Limit: 2000MS   Memory Limit: 30000K
Total Submissions: 8117   Accepted: 1883

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 <iostream>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <queue>
#include <stack>
#include <map>
#include <algorithm>
#define INF 0x3f3f3f3f using namespace std;
int Map[210][210][2];
bool vis[210][210];
int n,m,Max;
double fx,fy;
int Fx,Fy;
struct node
{
int x;
int y;
int ans;
};
void BFS()
{
queue<node>Q;
node a,b;
a.x=Fx;
a.y=Fy;
a.ans=0;
Max=INF;
memset(vis,false,sizeof(vis));
vis[Fx][Fy]=true;
Q.push(a);
while(!Q.empty())
{
a=Q.front();
Q.pop();
if(a.x==0||a.x>199||a.y==0||a.y>199)
{
if(a.ans<Max)
{
Max=a.ans;
}
continue;
}
if(a.ans>Max)剪枝
{
continue;
}
b.x=a.x+1;
b.y=a.y;
if(!vis[b.x][b.y]&&Map[a.x][a.y][1]!=1)//由于用左边或下边的点表示该点的状态,所以对于向右或向上判断Map[a.x][a.y][]的状态、
{ //对于向左或向下判断Map[b.x][b.y]的状态
vis[b.x][b.y]=true;
if(Map[a.x][a.y][1]==2)
{
b.ans=a.ans+1;
}
else
{
b.ans=a.ans;
}
Q.push(b);
}
b.x=a.x-1;
b.y=a.y;
if(!vis[b.x][b.y]&&Map[b.x][b.y][1]!=1)
{
vis[b.x][b.y]=true;
if(Map[b.x][b.y][1]==2)
{
b.ans=a.ans+1;
}
else
{
b.ans=a.ans;
}
Q.push(b);
}
b.x=a.x;
b.y=a.y+1;
if(!vis[b.x][b.y]&&Map[a.x][a.y][0]!=1)
{
vis[b.x][b.y]=true;
if(Map[a.x][a.y][0]==2)
{
b.ans=a.ans+1;
}
else
{
b.ans=a.ans;
}
Q.push(b);
}
b.x=a.x;
b.y=a.y-1;
if(!vis[b.x][b.y]&&Map[b.x][b.y][0]!=1)
{
vis[b.x][b.y]=true;
if(Map[b.x][b.y][0]==2)
{
b.ans=a.ans+1;
}
else
{
b.ans=a.ans;
}
Q.push(b);
}
}
if(Max==INF)
{
cout<<"-1"<<endl;
}
else
printf("%d\n",Max);
}
int main()
{
int x,y,t,d;
while(scanf("%d %d",&n,&m))
{
if(n==-1&&m==-1)
{
break;
}
memset(Map,0,sizeof(Map));
while(n--)
{
scanf("%d %d %d %d",&x,&y,&d,&t);
if(d)
{
for(int i=0; i<t; i++)//用左边或下边的点表示该点的状态
{
Map[x-1][y+i][1]=1;
}
}
else
{
for(int i=0; i<t; i++)
{
Map[x+i][y-1][0]=1;
}
}
}
while(m--)
{
scanf("%d %d %d",&x,&y,&d);
if(d)
{
Map[x-1][y][1]=2;
}
else
{
Map[x][y-1][0]=2;
}
}
scanf("%lf %lf",&fx,&fy);
Fx=int(fx);
Fy=int(fy);
if(Fx==0||Fy==0||Fx>199||Fy>199)
{
printf("0\n");
continue;
}
BFS();
}
return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

Finding Nemo 分类: POJ 2015-07-11 10:11 10人阅读 评论(0) 收藏的更多相关文章

  1. C#中的线程(上)-入门 分类: C# 线程 2015-03-09 10:56 53人阅读 评论(0) 收藏

    1.     概述与概念 C#支持通过多线程并行地执行代码,一个线程有它独立的执行路径,能够与其它的线程同时地运行.一个C#程序开始于一个单线程,这个单线程是被CLR和操作系统(也称为"主线 ...

  2. C#多线程(下) 分类: C# 线程 2015-03-09 10:41 153人阅读 评论(0) 收藏

    四.多线程的自动管理(线程池) 在多线程的程序中,经常会出现两种情况: 一种情况: 应用程序中,线程把大部分的时间花费在等待状态,等待某个事件发生,然后才能给予响应 这一般使用ThreadPool(线 ...

  3. DateTime日期格式获取 分类: C# 2014-04-15 10:36 233人阅读 评论(0) 收藏

    c#.net 获取时间年月日时分秒格式 //获取日期+时间 DateTime.Now.ToString();            // 2008-9-4 20:02:10 DateTime.Now. ...

  4. 山东理工大学第七届ACM校赛-学区房问题 分类: 比赛 2015-06-26 10:23 89人阅读 评论(0) 收藏

    Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 铁牌狗在学区B有一套面积为S1平方米的房子,现在他为了让后代进化成金牌狗,决定在学区A购 ...

  5. hadoop调优之一:概述 分类: A1_HADOOP B3_LINUX 2015-03-13 20:51 395人阅读 评论(0) 收藏

    hadoop集群性能低下的常见原因 (一)硬件环境 1.CPU/内存不足,或未充分利用 2.网络原因 3.磁盘原因 (二)map任务原因 1.输入文件中小文件过多,导致多次启动和停止JVM进程.可以设 ...

  6. Rebuild my Ubuntu 分类: ubuntu shell 2014-11-08 18:23 193人阅读 评论(0) 收藏

    全盘格式化,重装了Ubuntu和Windows,记录一下重新配置Ubuntu过程. //build-essential sudo apt-get install build-essential sud ...

  7. ios UIKit动力 分类: ios技术 2015-07-14 12:55 196人阅读 评论(0) 收藏

    UIkit动力学是UIkit框架中模拟真实世界的一些特性. UIDynamicAnimator 主要有UIDynamicAnimator类,通过这个类中的不同行为来实现一些动态特性. 它一般有两种初始 ...

  8. iOS纯代码手动适配 分类: ios技术 2015-05-04 17:14 239人阅读 评论(0) 收藏

    首先说下让自己的程序支持iPhone6和6+,第一种使用官方提供的launch screen.xib,这个直接看官方文档即可,这里不再多述:第二种方法是和之前iPhone5的类似,比较简单,为iPho ...

  9. iOS开发之监听键盘高度的变化 分类: ios技术 2015-04-21 12:04 233人阅读 评论(0) 收藏

    最近做的项目中,有一个类似微博中的评论转发功能,屏幕底端有一个输入框用textView来做,当textView成为第一响应者的时候它的Y值随着键盘高度的改变而改变,保证textView紧贴着键盘,但又 ...

  10. 全方位分析Objcetive-C Runtime 分类: ios技术 2015-03-11 22:29 77人阅读 评论(0) 收藏

    本文详细整理了 Cocoa 的 Runtime 系统的知识,它使得 Objective-C 如虎添翼,具备了灵活的动态特性,使这门古老的语言焕发生机.主要内容如下: 引言 简介 与Runtime交互 ...

随机推荐

  1. linux:centos准备及安装

    1>.安装前准备(将虚拟机和映像文件iso下载好) 1.1>.centos下载(建议使用Filezilla下载(http://filezilla-project.org/download. ...

  2. 轉發和重定向-JSP

    最近在復習JSP,寫案例時遇到轉發和重定向的問題,忽然忘記了好多東西.趕緊搜索了下,感覺還是比較常用的. 轉:http://blog.csdn.net/CYHJRX/article/details/3 ...

  3. [reprint]malloc与calloc的区别

    [http://blog.163.com/crazy20070501@126/] 转自某自由人的博客: malloc与calloc的区别 函数malloc()和calloc()都可以用来动态分配内存空 ...

  4. ACM之Java速成(1)

    这里指的java速成,只限于java语法,包括输入输出,运算处理,字符串和高精度的处理,进制之间的转换等,能解决OJ上的一些高精度题目. 1. 输入: 格式为:Scanner cin = new Sc ...

  5. sql where 1=1

    这段代码应该是由程序(例如Java)中生成的,where条件中 = 之后的条件是通过 if 块动态变化的.例如: String sql="select * from table_name w ...

  6. angular ng-href

    farmApp.config([ '$compileProvider', function( $compileProvider ) { $compileProvider.aHrefSanitizati ...

  7. visio的简单用法

    visio图边缘会自动扩展 将常用工具放到收藏夹中,拖进去就可以用. 基本形状基本能够满足一般的需求. 支持自己定义形状,将定义好的形状右击组合之后,收藏到收藏夹或导出模版. 多用组合,收藏夹,调整图 ...

  8. 一段OpenGL的简单代码

    这是基于OpenGL的代码,把它放进draw中即可.渲染出来的效果还不错 #define PI 3.14159 #define N 100 void test::Draw() { glClearCol ...

  9. GitHub Desktop for Win 安装不上

    采用了ClickOnce部署方式,网速不给力,安装过程经常断线,要是有离线安装包就好了.

  10. 匹配表单中所有的子级input元素。

    HTML 代码: <form> <label>Name:</label> <input name="name" /> <fie ...