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交互 ...
随机推荐
- Git_Commands
- Swift游戏实战-跑酷熊猫 12 与平台的碰撞
这节主要实现熊猫和平台的碰撞,实现熊猫在平台上奔跑 要点 对平台进行物理属性设置 //设置物理体以及中心点 self.physicsBody = SKPhysicsBody(rectangleOfSi ...
- stucts2 基础程序
参考<Struts2+Hibernate+Spring> index.jsp
- HDU 1402 A * B Problem Plus(FFT)
Problem Description Calculate A * B. Input Each line will contain two integers A and B. Process to ...
- JSon_零基础_001_将布尔类型数组转换为JSon格式字符串,返回给界面
将布尔类型数组转换为JSon格式字符串,返回给界面 需要导入包: 编写bean: package com.west.webcourse.po; /** * 第01步:编写bean类, * 下一步com ...
- demo04calc
package com.example.demo05simplecalc; import android.os.Bundle; import android.app.Activity; import ...
- Android测试AsyncTask下载图片
package com.example.myact8_async; import org.apache.http.HttpEntity; import org.apache.http.HttpResp ...
- paper 75:使用MATLAB的神经网络工具箱创建神经网络
% 生成训练样本集 clear all; clc; P=[110 0.807 240 0.2 15 1 18 2 1.5; 110 2.865 240 0.1 15 2 12 1 2; 110 2.5 ...
- oracle中的函数
ORACLE中函数 Oracle已经内建了许多函数,不同的函数有不同的作用和用法,有的函数只能作用在一个记录行上,有的能够作用在多个记录行上,不同的函数可能处理不同的数据类型.常见的 ...
- java类的访问权限
1.解析 Java有四种访问权限, 其中三种有访问权限修饰符,分别为private,public和protected,还有一种不带任何修饰符. private: Java语言中对访问权限限制的最窄的修 ...