POJ 2049 Finding Nemo bfs 建图很难。。

时间:2022-09-04 09:24:06
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. 
POJ 2049 Finding Nemo  bfs  建图很难。。
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&sol;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建图&plus;最小生成树

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

  4. poj 2049 Finding Nemo&lpar;优先队列&plus;bfs&rpar;

    题目: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 水壶&lpar;BFS建图&plus;最小生成树&plus;树上倍增&rpar;

    题意 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费用流&plus;BFS建图

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

随机推荐

  1. Crystal Reports 2008&lpar;水晶报表&rpar; 启动时检查更新

    在安装好了Crystal Reports后,每次打开的是都会出现以下提示: 服务器正在运行中 由于另一个程序正在运行中,此操作无法完成.请选择“切换到”来激活正在运行中的程序,并更正问题. 碰到这样的 ...

  2. wampserver的php&period;ini文件

    在修改php.ini文件时,找到了php文件夹下的php.ini文件,但是重启所有服务后就是不起作用.查看前辈的博客后,明白了是在apache目录下的php.ini才是起作用的. .

  3. 11&period;Android之常用对话框AlertDialog学习

    (1)首先我们写个简单的AlertDialog对话框,要创建一个AlertDialog,就要用到AlertDialog.Builder中的create()方法,然后创建对话框可以设置对话框的属性,比如 ...

  4. POJ-2785 4 Values whose Sum is 0&lpar;折半枚举 sort &plus; 二分&rpar;

    题目链接:http://poj.org/problem?id=2785 题意是给你4个数列.要从每个数列中各取一个数,使得四个数的sum为0,求出这样的组合的情况个数. 其中一个数列有多个相同的数字时 ...

  5. &lbrack;转&rsqb;&period;net连oracle的问题及方法折腾总结 连接字串

    本文转自:http://www.th7.cn/Program/net/201305/138265.shtml 对oracle不算熟,对.net结合oracle开发项目也只做过一个.最近换了新电脑,装了 ...

  6. Java R&amp&semi;W Related

    In Java, byte = 8 bit, char = 16 bit In C/C++, char = 8 bit There is difference because Java uses Un ...

  7. &lbrack;转&rsqb;POJ1006&colon; 中国剩余定理的完美演绎

    Biorhythms Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 117973   Accepted: 37026 Des ...

  8. IIS最小配置

    目的 : IIS按需要配置练习      测试环境 IIS 10  WIN10 1.安装IIS与建立网站 安装IIS略,服务器版用添加角色,用户版添加删除WINDOWS组件. 装好IIS之后,建一个网 ...

  9. Ext&period;form&period;field&period;Picker &lpar;ComboBox、Date、TreePicker、colorpick&period;Field&rpar;竖向滚动导致布局错误

    ComboBox.Date.TreePicker.colorpick.Field这些继承了Ext.form.field.Picker的控件. 在6.0.0和6.0.1中,在界面中存在竖向滚动条时,点击 ...

  10. redis-java基础操作

    安装 windows版的Redis,打开即可,默认端口6379 导入两个jar包  commons-pool2-2.3.jar   jedis-2.7.0.jar 一 写配置文件 redis.setM ...