Finding Nemo 分类: POJ 2015-07-11 10:11 10人阅读 评论(0) 收藏
| Time Limit: 2000MS | Memory Limit: 30000K | |
| Total Submissions: 8117 | Accepted: 1883 |
Description
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
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
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) 收藏的更多相关文章
- C#中的线程(上)-入门 分类: C# 线程 2015-03-09 10:56 53人阅读 评论(0) 收藏
1. 概述与概念 C#支持通过多线程并行地执行代码,一个线程有它独立的执行路径,能够与其它的线程同时地运行.一个C#程序开始于一个单线程,这个单线程是被CLR和操作系统(也称为"主线 ...
- C#多线程(下) 分类: C# 线程 2015-03-09 10:41 153人阅读 评论(0) 收藏
四.多线程的自动管理(线程池) 在多线程的程序中,经常会出现两种情况: 一种情况: 应用程序中,线程把大部分的时间花费在等待状态,等待某个事件发生,然后才能给予响应 这一般使用ThreadPool(线 ...
- DateTime日期格式获取 分类: C# 2014-04-15 10:36 233人阅读 评论(0) 收藏
c#.net 获取时间年月日时分秒格式 //获取日期+时间 DateTime.Now.ToString(); // 2008-9-4 20:02:10 DateTime.Now. ...
- 山东理工大学第七届ACM校赛-学区房问题 分类: 比赛 2015-06-26 10:23 89人阅读 评论(0) 收藏
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 铁牌狗在学区B有一套面积为S1平方米的房子,现在他为了让后代进化成金牌狗,决定在学区A购 ...
- hadoop调优之一:概述 分类: A1_HADOOP B3_LINUX 2015-03-13 20:51 395人阅读 评论(0) 收藏
hadoop集群性能低下的常见原因 (一)硬件环境 1.CPU/内存不足,或未充分利用 2.网络原因 3.磁盘原因 (二)map任务原因 1.输入文件中小文件过多,导致多次启动和停止JVM进程.可以设 ...
- Rebuild my Ubuntu 分类: ubuntu shell 2014-11-08 18:23 193人阅读 评论(0) 收藏
全盘格式化,重装了Ubuntu和Windows,记录一下重新配置Ubuntu过程. //build-essential sudo apt-get install build-essential sud ...
- ios UIKit动力 分类: ios技术 2015-07-14 12:55 196人阅读 评论(0) 收藏
UIkit动力学是UIkit框架中模拟真实世界的一些特性. UIDynamicAnimator 主要有UIDynamicAnimator类,通过这个类中的不同行为来实现一些动态特性. 它一般有两种初始 ...
- iOS纯代码手动适配 分类: ios技术 2015-05-04 17:14 239人阅读 评论(0) 收藏
首先说下让自己的程序支持iPhone6和6+,第一种使用官方提供的launch screen.xib,这个直接看官方文档即可,这里不再多述:第二种方法是和之前iPhone5的类似,比较简单,为iPho ...
- iOS开发之监听键盘高度的变化 分类: ios技术 2015-04-21 12:04 233人阅读 评论(0) 收藏
最近做的项目中,有一个类似微博中的评论转发功能,屏幕底端有一个输入框用textView来做,当textView成为第一响应者的时候它的Y值随着键盘高度的改变而改变,保证textView紧贴着键盘,但又 ...
- 全方位分析Objcetive-C Runtime 分类: ios技术 2015-03-11 22:29 77人阅读 评论(0) 收藏
本文详细整理了 Cocoa 的 Runtime 系统的知识,它使得 Objective-C 如虎添翼,具备了灵活的动态特性,使这门古老的语言焕发生机.主要内容如下: 引言 简介 与Runtime交互 ...
随机推荐
- java collections读书笔记(11) Lists
继续这个系列,好久没学习了,懒惰呀. Set接口,实际上是collection 类别中最简单的一个接口,因为它并没有比Collection 接口增加任何的内容,相对而言,大家可能更喜欢List接口和它 ...
- Compile Sources 和 Copy Bundle Resources的区别
Compile Sources主要存放.m文件 Copy Bundle Resources 主要存放xib plist bundle js 文件
- .pch头文件的添加
在工程中找Building Settings --> language -->prefix Header -->填写.pch的路径
- 2-sat(石头、剪刀、布)hdu4115
Eliminate the Conflict Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
- c++ 中this底层
成员变量设置在一个结构体中, 操作成员变量的成员函数,其实质上就是拥有一个隐藏的 成员变量结构体的地址指针,俗称this指针.
- Android测试AsyncTask下载图片
package com.example.myact8_async; import org.apache.http.HttpEntity; import org.apache.http.HttpResp ...
- android怎么换背景图片
我不晓得一般是怎么做的,但是至少可以用两种方法,一种是用一个全屏的ImageView来当作背景,通过修改imageview来修改背景图片,一种是将你xml中最外层的那个布局,LinerLayout之类 ...
- Android应用开发中的风格和主题(style,themes)
http://www.cnblogs.com/playing/archive/2011/04/01/2002469.html 越来越多互联网企业都在Android平台上部署其客户端,为了提升用户体验, ...
- 使用 nano 的时候提示找不到 libncursesw.so.5 这个共享库
由于拿nano来练习pacman这个包管理系统,也就是卸了装,装了卸.但是后来当我想用 nano 编辑文件的时候,系统提示标题上说的这错误. 不知道做了什么,难道是误删了什么东西...后来几番搜索,用 ...
- SQL数据库之变量
--学习SQL数据库,变量是必须要掌握的概念,系统变量就是变量中最重要的变量之一,下面是SQL中系统变量的应用实例 use AdventureWorksDW exec sp_addtype 'char ...