IEEEXtreme 10.0 - Mysterious Maze
这是 meelo 原创的 IEEEXtreme极限编程大赛题解
Xtreme 10.0 - Mysterious Maze
题目来源 第10届IEEE极限编程大赛
https://www.hackerrank.com/contests/ieeextreme-challenges/challenges/mysterious-maze
There is a valuable treasure that is hidden below a complex maze. The maze is made of rooms and are square in shape, and a maze of size N will have N × N rooms with all of them closed initially. When a room is open, one can enter into it from any of its adjacent open rooms; two rooms are adjacent if they share a common wall.
The maze was built in a way that it opens itself by opening its rooms randomly. A maze is said to be open if there is at least one path from any one of the rooms facing the top of the maze to any room on the bottom side facing the treasure. Anyone, who attempts to enter the maze without being able to reach the treasure and return, will be cruelly killed by the maze.
The local government has spent years researching the maze and figured out a way to determine the sequence of rooms being opened in almost real time. Based on this data, the government has posed the following challenge, with a small percentage of the treasure to whomever solves the problem:
Given the sequence of room openings, determine when the maze becomes open, or if it remains closed throughout.
Input Format
Input begins with a single integer N, which denotes the size of maze.
All of the next lines (except the last one) denotes the sequence of the rooms the maze is opening. Each line contains 2 integers X and Y which denotes the row and column of the room opened by the maze. The last line just includes -1 and marks the end of input.
Constraints
1 <= X, Y <= N <= 1000
Output Format
Output a single integer R based on the final status of the maze. R denotes the number of room openings that occur before the maze first becomes open, or -1 if the maze remains closed.
Sample Input
4
1 4
2 3
3 2
4 3
4 1
2 1
1 1
-1
Sample Output
-1
Explanation
It is easy to understand if you plot the maze. The following is the state of the maze at the end of the inputs. Xindicates that a room is closed and O that a room is open. Note that there is no path from the top of the maze to the bottom of the maze.
O X X O
O X O X
X O X X
O X O X
Consider the second input sample (which is available if you click on the Run Code button):
4
1 4
2 3
3 2
4 3
4 1
2 1
1 1
3 1
3 4
2 2
-1
Below is a figure with the maze after 7 rooms are open. Note that there is no path from the top of the maze to the bottom of the maze, and therefore the maze is closed.
O X X O
O X O X
X O X X
O X O X
However, after 8th room is open, there is a path, as shown below:
O X X O
O X O X
O O X X
O X O X
Thus, the expected output is:
8
题目解析
这个题目像是一个搜索题,从上侧出发看是否能够搜索到下侧。搜索一次需要O(M^2)。每开一次门,都需要搜索1次。复杂度就到了10^9,铁定会超时。
迷宫是否连通,有点像两个节点是否是1类。判断两个节点是否是1类,可以用并查集嘛。
每打开一个房间,就将上下左右的房间合并成1类,需要O(log(M))的时间。
上侧和下侧分别建立一个虚拟节点,初始与第1行的房间和最后1行的房间相连。
每打开一个房间,判断上侧虚拟节点是否与下侧虚拟节点节点是否属于同一类。如果属于同一类,迷宫则被打通了。
总的复杂度为O(Nlog(M))。
程序
C++
#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std; int find(vector<int> &parent, int x) {
int px;
if(parent[x] < ) {
px = x;
}
else {
px = find(parent, parent[x]);
parent[x] = px;
}
return px;
} void union_(vector<int> &parent, int x, int y) {
int px = find(parent, x);
int py = find(parent, y); if(px != py) { if(parent[px] < parent[py]) {
parent[px] += parent[py];
parent[py] = px;
}
else {
parent[py] += parent[px];
parent[px] = py;
}
}
} bool legal(int x, int y, int H) {
return (x >= && x <= H) && (y >= && y <=H);
} int pos2Index(int x, int y, int H) {
return (x-) * H + (y-);
} int main() {
int H;
cin >> H;
vector<int> parent(H*H+, -);
vector<vector<bool> > maze(H+, vector<bool>(H+, )); for(int i=; i<=H; i++) {
union_(parent, pos2Index(, i, H), H*H);
union_(parent, pos2Index(H, i, H), H*H+);
} int dir[][] = {{,}, {,-}, {,}, {-,}};
int count = ;
while(true) {
int x, y;
cin >> x;
if(x == -) {
cout << - << endl;
break;
}
cin >> y;
maze[x][y] = true;
for(int d=; d<; d++) {
int nx = x + dir[d][];
int ny = y + dir[d][]; if(legal(nx, ny, H) && maze[nx][ny]) {
union_(parent, pos2Index(x, y, H), pos2Index(nx, ny, H));
}
}
if(find(parent, H*H) == find(parent, H*H+)) {
cout << count;
break;
}
count++;
} return ;
}
IEEEXtreme 10.0 - Mysterious Maze的更多相关文章
- IEEEXtreme 10.0 - Mancala'h
这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Mancala'h 题目来源 第10届IEEE极限编程大赛 https://www.hackerrank.c ...
- IEEEXtreme 10.0 - Inti Sets
这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Inti Sets 题目来源 第10届IEEE极限编程大赛 https://www.hackerrank.c ...
- IEEEXtreme 10.0 - Painter's Dilemma
这是 meelo 原创的 IEEEXtreme极限编程比赛题解 Xtreme 10.0 - Painter's Dilemma 题目来源 第10届IEEE极限编程大赛 https://www.hack ...
- IEEEXtreme 10.0 - Ellipse Art
这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Ellipse Art 题目来源 第10届IEEE极限编程大赛 https://www.hackerrank ...
- IEEEXtreme 10.0 - Counting Molecules
这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Counting Molecules 题目来源 第10届IEEE极限编程大赛 https://www.hac ...
- IEEEXtreme 10.0 - Checkers Challenge
这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Checkers Challenge 题目来源 第10届IEEE极限编程大赛 https://www.hac ...
- IEEEXtreme 10.0 - Game of Stones
这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Game of Stones 题目来源 第10届IEEE极限编程大赛 https://www.hackerr ...
- IEEEXtreme 10.0 - Playing 20 Questions with an Unreliable Friend
这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Playing 20 Questions with an Unreliable Friend 题目来源 第1 ...
- IEEEXtreme 10.0 - Full Adder
这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Full Adder 题目来源 第10届IEEE极限编程大赛 https://www.hackerrank. ...
随机推荐
- git clone 指定分支的内容
使用Git下载指定分支命令为:git clone -b 分支名仓库地址 使用Git下载v.2.8.1分支代码,使用命令:git clone -b v2.8.1 https://git.oschina. ...
- synchronized 加锁Integer对象(数据重复)详解
场景描述:多线程输出1到100,对静态Integer对象加锁,synchronized代码块中操作Integer对象,发生线程安全问题(数据重复) 代码: public class MyRunnabl ...
- (转)C++常见问题: 字符串分割函数 split
http://www.cnblogs.com/dfcao/p/cpp-FAQ-split.html C++标准库里面没有字符分割函数split ,这可太不方便了,我已经遇到>3次如何对字符串快速 ...
- java io-1基本概念
java io-1基本概念 2015-07-03 15:17 648人阅读 评论(0) 收藏 举报 分类: [JavaSE](37) 目录(?)[+] ------------------ ...
- OpenCV---色彩空间(二)HSV追踪颜色对象和通道分离与合并
一:HSV追踪有颜色对象 def inRange(src, lowerb, upperb, dst=None) #lowerb是上面每个颜色分段的最小值,upperb是上面每个颜色分段的最大值,都是列 ...
- extjs 省市县级联
Ext.define('State', { extend: 'Ext.data.Model', fields: [ {type: 'string', name: 'nevalue'}, {type: ...
- 优先队列 逆向思维 Gym 101128C
题目链接:http://codeforces.com/gym/101128/my 具体题目大意可以看这个人的:http://blog.csdn.net/v5zsq/article/details/61 ...
- [译]Quartz 框架 教程(中文版)2.2.x 之第二课 Quartz API,Jobs和Triggers简介
第二课:QuartzAPI,Jobs和Triggers简介 Quartz API Quartz API 关键的几个接口: Scheduler:跟任务调度相关的最主要的API接口. Job:你期望任务调 ...
- cropper.js 跨域问题
this.$clone = $clone = $('<img>'); $clone.one('load', $.proxy(function () { var naturalWidth = ...
- python之yagmail库笔记
1. yagmail是啥 yagmail是给正常人用的,封装的比较彻底的一个python邮件库,发送接收邮件只需要几行代码,炒鸡简单. 2. 安装 使用pip安装,炒鸡简单: pip install ...