UOJ UER#5 A 万圣节的南瓜灯
来源:互联网 发布:人不知而不愠的知 编辑:程序博客网 时间:2024/03/29 22:37
红包是一个心灵手巧的男孩子。今天是万圣节,红包正在家里制作南瓜灯。
这时候一群熊孩子们敲开了红包家的门,他们高呼着“不用给糖,只要捣蛋”的口号把红包的南瓜灯弄坏了。这让红包很难过,于是他打算把这些被弄坏的南瓜灯做成其他的工艺品。
红包把它的南瓜灯划分成了
对于一个有
现在红包有
输入格式
第一行一个正整数
对于每一个南瓜灯,第一行是三个整数
接下来
数据保证
输出格式
对于每一个南瓜灯,输出一行,如果这个南瓜灯能被做成工艺品,那么输出 "Yes",否则输出 "No"。
样例一
input
33 3 42 12 33 13 33 3 51 11 22 13 13 23 3 41 12 22 33 3
output
NoYesNo
explanation
对于第一组数据,
对于第三组数据,
样例二
见样例数据下载。
限制与约定
对于所有数据,
时间限制:
经队友介绍了这个比赛的OJ,想看看题目难度。按这个easy round看了一下第一题,表示当时没细想被难住了。。。
这个题目就是给定一个类似迷宫的矩阵,有些地方是不能走的,左右边界看作连通,上下边界不连通,问能走的地方是不是任意两个格子有且只有一条路径连通。
当时一看数据我是傻了的。。这么大怎么搞。。
后来发现K最大100000是非常有用的,因为如果n * m大于400000的话,肯定输出的是No,因为对于这样一个左右连通的迷宫,必须有一整列是堵死的,不然左右肯定可以构成一条回路,就GG了,所以大于400000以上的直接输出No。
然后怎么表示迷宫呢,很简单,既然数不会大于400000,索性就开一个一维的数组来表示好了。一个block表示不能走的,一个vis表示走过的,任取一个可以走的点,进行DFS,只要发现DFS过程中出现重复走的情况,立刻判断是有回路的跳出,输出No,如果最后dfs完遍历的顶点并没有达到所有的没有阻碍的点的话,说明有两个点之间没有路径,也输出No,其他输出Yes
代码如下:
/*************************************************************************> File Name: A.cpp> Author: Zhanghaoran> Mail: chilumanxi@xiyoulinux.org> Created Time: Thu 03 Dec 2015 12:30:42 AM CST ************************************************************************/#include <iostream>#include <algorithm>#include <cstring>#include <cstdio>#include <cstdlib>#define pos(x, y) ((x - 1) * m + y)using namespace std;int T;long n, m, K;long x, y;int block[410000];int vis[410000];bool flag = false;int dx[4] = {0, 0, 1, -1};int dy[4] = {1, -1, 0, 0};int all;void dfs(int x, int y, int lx, int ly){ if(vis[pos(x, y)]){ flag = true; return ; } all ++; vis[pos(x, y)] = 1; for(int i = 0; i < 4; i ++){ int tempx = x + dx[i]; int tempy = y + dy[i]; if(tempy == m + 1) tempy = 1; if(tempy == 0) tempy = m; if(tempx == 0 || tempx == n + 1 || block[pos(tempx, tempy)] || (tempx == lx && tempy == ly)) continue; dfs(tempx, tempy, x, y); if(flag) return ; }}int main(void){ cin >> T; while(T --){ cin >> n >> m >> K; if(n * m > 400000){ for(int i = 0; i < K; i ++) scanf("%*d %*d"); puts("No"); continue; } flag = false; memset(vis, 0, sizeof(vis)); memset(block, 0, sizeof(block)); for(int i = 0; i < K; i ++){ scanf("%d%d", &x, &y); block[pos(x, y)] = 1; } all = K; for(int i = 1; i <= n * m; i ++){ if(!block[i] && !vis[i]){ dfs((i - 1) / m + 1, (i - 1) % m + 1, -1, -1); break; } } if(all != n * m) flag = true; if(flag) puts("No"); else puts("Yes"); } return 0;}
- UOJ UER#5 A 万圣节的南瓜灯
- 【UER #5】万圣节的南瓜灯
- [并查集] UOJ#142. 【UER #5】万圣节的南瓜灯
- [构造 分治] UOJ#143. 【UER #5】万圣节的数列
- 万圣节各种搞怪的南瓜
- 【构造+分治】【UER #5】UOJ143 万圣节的数列
- [uoj#209][UER#6A]票数统计
- uoj A. 【UER #7】短路 (贪心)
- [UOJ#244][UER#7A]短路
- 【UOJ #244】【UER #7 A】短路
- UOJ #113. 【UER #2】手机的生产
- PS制作万圣节南瓜
- [UOJ#244][UER#7A]短路(贪心)
- 快乐万圣节南瓜ppt模板
- UOJ#136. 【UER #3】开学前的作文
- UOJ 245 [UER #7]天路
- UOJ#245. 【UER #7】天路
- uoj 246. 【UER #7】套路
- POJ 1029 False coin
- Linux的加密认证功能以及openssl详解
- stm32 开始之路,第一篇,写一些闲话。
- leetcode之Symmetric Tree
- java图形处理-Java 2D
- UOJ UER#5 A 万圣节的南瓜灯
- 输出频率最高的那个单词
- Ctags自动补全(不使用grep)
- 大数加法
- 大数减法
- 大数乘法
- JAVA与Android接口回调浅析;
- 大数除法
- ios8开发者企业账号和个人账号申请注册