POJ 2049 Finding Nemo bfs 建图很难。。
| Time Limit: 2000MS | Memory Limit: 30000K | |
| Total Submissions: 6952 | Accepted: 1584 | 
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 <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 建图很难。。的更多相关文章
- POJ 2049— Finding Nemo(三维BFS)10/200
		
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u013497151/article/details/29562915 海底总动员.... 这个题開始 ...
 - POJ 2049 Finding Nemo
		
Finding Nemo Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 8631 Accepted: 2019 Desc ...
 - poj 3026 Borg Maze bfs建图+最小生成树
		
题目说从S开始,在S或者A的地方可以分裂前进. 想一想后发现就是求一颗最小生成树. 首先bfs预处理得到每两点之间的距离,我的程序用map做了一个映射,将每个点的坐标映射到1-n上,这样建图比较方便. ...
 - poj 2049 Finding Nemo(优先队列+bfs)
		
题目:http://poj.org/problem?id=2049 题意: 有一个迷宫,在迷宫中有墙与门 有m道墙,每一道墙表示为(x,y,d,t)x,y表示墙的起始坐标d为0即向右t个单位,都是墙d ...
 - TTTTTTTTTTTTTTTTTT POJ  2724   奶酪消毒机    二分匹配  建图 比较难想
		
Purifying Machine Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 5004 Accepted: 1444 ...
 - POJ 3687 Labeling Balls   逆向建图,拓扑排序
		
题目链接: http://poj.org/problem?id=3687 要逆向建图,输入的时候要判重边,找入度为0的点的时候要从大到小循环,尽量让编号大的先入栈,输出的时候注意按编号的顺序输出重量, ...
 - BZOJ 4242 水壶(BFS建图+最小生成树+树上倍增)
		
题意 JOI君所居住的IOI市以一年四季都十分炎热著称. IOI市是一个被分成纵H*横W块区域的长方形,每个区域都是建筑物.原野.墙壁之一.建筑物的区域有P个,编号为1...P. JOI君只能进入建筑 ...
 - 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 ...
 - POJ2195费用流+BFS建图
		
题意: 给你一个n*m的地图,上面有w个人,和w个房子,每个人都要进房子,每个房子只能进一个人,问所有人都进房子的路径总和最少是多少? 思路: 比较简单的最大流,直接建立两排, ...
 
随机推荐
- uva 1030 - Image Is Everything(迭代更新)
			
题目链接:uva 1030 - Image Is Everything 题目大意:有一个最大为n*n*n的立方体的一个不规整立体,由若干个1*1*1的小正方体构成(每一个小正方体被涂成不同的颜色),给 ...
 - Thoughtworks的技术雷达
			
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:Thoughtworks的技术雷达.
 - (转)解决png图片在IE6下不透明的方法
			
来源于:http://xzl52199.blog.163.com/blog/static/95206446201142174540220/ 一.传统的JavaScript方法 思路: 1.一个专门解决 ...
 - 2014年到期的myeclipse5.5.1注冊码
			
假设点击Myeclipse的载入项目到server的图标没有反应,这就是MyEclipse过期了,下面是还能用一年的注冊码: subscriber: axin Serial:nLR8ZC-85557 ...
 - linux文件的隐藏属性:chattr
			
1. 文件的隐藏属性 linux除了9个权限外,还有些隐藏属性, 使用chattr命令来设置. 使用方法: $ chattr +-=[ASacDdIijsTtu] + : 添加一个特殊參数 - : ...
 - hdu 1199 Color the Ball(离散化线段树)
			
Color the Ball Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) T ...
 - FolderBrowserDialog使用
			
private void button_browse_Click(object sender, EventArgs e) { FolderBrowserDialog fbd = new FolderB ...
 - Eclipse - 安装 run-jetty-run 插件及使用 jrebel 热部署
			
安装 run-jetty-run 插件 1. 下载 run-jetty-run 2. 解压至 Eclipse/MyEclipse 安装目录下的 plugin 3. 右键 web 项工程,选择 Run ...
 - .NET性能优化方面的总结
			
从2004年底开始接触C#到现在也有2年多的时间了,因为有C++方面的基础,对于C#,我习惯于与C++对比.现在总结一些.NET方面的性能优化方面的经验,算是对这两年多的.NET工作经历的总结. ...
 - java.util.zip压缩打包文件总结一:压缩文件及文件下面的文件夹
			
一.简述 zip用于压缩和解压文件.使用到的类有:ZipEntry ZipOutputStream 二.具体实现代码 package com.joyplus.test; import java.io ...