描述
小Kui喜欢把别人的名字拆开来,比如“螺”就可以拆成“虫田糸”,小Kui的语文学的不是很好,于是她决定使用编程的方式来解决这个问题。

给出一个01矩阵,1占据的部分即为需要拆的字,如果两个1分享一条边,那么它们连通。连通具有传递性,即如果a、b连通,b、c连通,则a、c连通。

连通的一系列1被看做可以拆出的一块,现在小Kui需要输出这些拆出的块(用一个01矩阵表示,并且要求矩阵的大小尽可能的小)。

为了确保输出的顺序尽可能的和书写的顺序一致,小Kui从每个块中选出最左上角的点(最左侧的点中,最靠上的)作为代表点,然后按照代表点从左到右(若相同则按从上到下)的顺序输出所有拆出的块。

输入
输入的第一行为两个正整数N、M,表示01矩阵的大小。

接下来N行,每行M个01字符,描述一个需要拆的字。

对于40%的数据,满足1<=N,M<=10。

对于100%的数据,满足1<=N,M<=500。

输出
按照代表点从左到右(若相同则按从上到下)的顺序输出所有拆出的块。

对于每个块,先输出其大小,然后用对应的01矩阵表示这个块。

额外的样例
样例输入
11 17
00000000000000000
00001111111100000
00000000000000000
00111111111111100
00000000100000000
00000010101110000
00000110100011000
00011100100001000
00000010100000000
00000001100000000
00000000000000000

样例输出
7 13
1111111111111
0000001000000
0000001000000
0000001000000
0000001000000
0000001000000
0000011000000
3 4
0001
0011
1110
1 8
11111111
1 1
1
3 4
1110
0011
0001

样例输入
14 22
0000000000001111111100
0000000000001101101100
0000110000001111111100
0000110000001101101100
0111111110001111111100
0110110110000000000000
0110110110000011000000
0111111110001111111000
0000110000000001100000
0000110110001111111100
0111111111000111111000
0000000010001101101100
0000000000000001100000
0000000000000011100000
样例输出
10 9
000110000
000110000
111111110
110110110
110110110
111111110
000110000
000110110
111111111
000000010
5 8
11111111
11011011
11111111
11011011
11111111
8 8
00110000
11111110
00011000
11111111
01111110
11011011
00011000
00111000

思路:

简单的bfs或者dfs求联通块,在dfs过程中要维护上下左右四个最值。然后记录下每个联通的1的坐标,最后输出的时候利用坐标变换把原图中的坐标映射到要输出的图中。也就是要输出的图是以left 和 up 作为新矩阵中 0,0这个点的。记录的每个联通的坐标要做 x - up, y - left 这样的变换。把1填到要输出的矩阵中行了。

#include <bits/stdc++.h>using namespace std;const int maxn = 505;int n, m;
string G[maxn];
int vis[maxn][maxn];
int up, down, Left, Right;int dir[4][2] = {{0,1}, {1,0}, {-1,0}, {0,-1}};bool judge(int x, int y) {if (x >= 0 && x < n && y >= 0 && y < m && G[x][y] == '1' && !vis[x][y]) {return true;}return false;
}void dfs(int x, int y, vector<pair<int,int>>& res) {vis[x][y] = 1;for (int i = 0; i < 4; ++i) {int dx = x + dir[i][0];int dy = y + dir[i][1];if (judge(dx, dy)) {if (dx < up) up = dx;if (dx > down) down = dx;if (dy > Right) Right = dy;if (dy < Left) Left = dy;res.push_back(make_pair(dx,dy));dfs(dx, dy, res);}}
}void print(int x, int y, vector<pair<int,int>>&res) {int len = Right - Left + 1;int width = down - up + 1;//cout << up << " " << down << " " << Left << " " << Right << endl;int g[width][len];for (int i = 0; i < width; ++i) {for(int j = 0; j < len; ++j)g[i][j] = 0;}cout << width << " " << len << endl;for (int i = 0; i < (int)res.size(); ++i) {auto now = res[i];int dx = now.first - up;int dy = now.second - Left;g[dx][dy] = 1;}for (int i = 0; i < width; ++i) {for (int j = 0; j < len; ++j)cout << g[i][j];cout << endl;}
}void solve() {vector<pair<int,int>>res;for (int j = 0; j < m; ++j) {for(int i = 0; i < n; ++i) {if (G[i][j] == '1' && !vis[i][j]) {up = i;down = i;Left = j;Right = j;res.clear();res.push_back(make_pair(i,j));dfs(i, j, res);print(i, j, res);}}}}int main() {cin >> n >> m;for (int i = 0; i < n; ++i) {cin >> G[i];}memset(vis, 0, sizeof(vis));solve();return 0;
}

每日一题之 hiho232周 拆字游戏相关推荐

  1. hiho232周 拆字游戏

    时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Kui喜欢把别人的名字拆开来,比如"螺"就可以拆成"虫田糸",小Kui的语文学的 ...

  2. 【LeetCode笔记 - 每日一题】375. 猜数字游戏 II (Java、DFS、动态规划)

    文章目录 题目描述 思路 && 代码 DFS 动态规划 新系列-用于区分开高频题和每日一题- 题目描述 一眼二分,但是实际上并不是 这题让我想到社团的猜数字游戏-但是给钱是真过分了= ...

  3. 每日一题_贪心_55_跳跃游戏

    前言 date: 8.10 今天终于早起了,困困困~~~ 题目来源: 55. 跳跃游戏(leetcode) 汇总文章 每日一题系列_算法提升 题目 题解 遍历一遍数组,并维护一个最右可到达边界的变量. ...

  4. 每日一题之 hiho235周 润秒(简单模拟)

    描述 计算机系统中使用的UTC时间基于原子钟,这种计时方式同"地球自转一周是24小时"的计时方式有微小的偏差.为了弥补这种偏差,我们偶尔需要增加一个"闰秒". ...

  5. 每日一题之hiho213周 Boarding Passes

    描述 Long long ago you took a crazy trip around the world. You can not remember which cities did you s ...

  6. 每日一题之hiho231周 小Ho的强迫症 (数学题)

    描述 小Ho在一条笔直的街道上散步.街道上铺着长度为L的石板,所以每隔L距离就有一条石板连接的缝隙,如下图所示. 小Ho在散步的时候有奇怪的强迫症,他不希望脚踩在石板的缝隙上.(如果小Ho一只脚的脚尖 ...

  7. acwing——每日一题——总结

    acwing--每日一题--总结 第一周 1.笨拙的手指(考查点:进制转换) 2.干草堆(考查点:差分+前缀和) 3.奶牛选美(bfs模板+floodfill算法) 4.拖拉机(bfs+双端队列=迪杰 ...

  8. 【每日一题】美国节日(基姆拉尔森公式、蔡勒公式)

    [每日一题]美国节日(基姆拉尔森公式.蔡勒公式)   相关文章:   [每日一题]一周中的第几天(基姆拉尔森公式的应用)   [每日一题]美国节日(基姆拉尔森公式.蔡勒公式)   [每日一题]计算日期 ...

  9. 18行代码AC-Leecode 299. 猜数字游戏——Leecode每日一题系列

    今天是坚持每日一题打卡的第十三天 题目链接:https://leetcode-cn.com/problems/bulls-and-cows/ 题解汇总:https://zhanglong.blog.c ...

最新文章

  1. 扶贫干部拍胸脯认证,AI开发者上手零门槛,百度打造 “云智一体”全栈开发杀手锏...
  2. Apache Httpd 2.2 配置CA证书,实现Https加密通讯
  3. [20150409]只读表空间与延迟块清除.txt
  4. 网站截图环境 php,Linux环境下php实现给网站截图的方法
  5. oracle as 不可以省略,Oracle:存储过程,存储函数
  6. 紧迫感:在危机中变革
  7. 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(三)
  8. 100的阶乘c语言代码,求10000的阶乘(c语言代码实现)
  9. asp.net防类似DDOS攻击(CC攻击)代码
  10. MyBatis Generator配置文件翻译
  11. [react] React的触摸事件有哪几种?
  12. 作家笔下的数学与数学家
  13. GIT 之概述与架构
  14. C语言判断两个数组是否有相同元素
  15. golang 关闭gc 并手动gc_Golang垃圾回收 屏障技术
  16. 201712-2-游戏
  17. 关与 @EnableConfigurationProperties 注解
  18. 第十二课,assimp模型加载(数据加载篇)
  19. myqr制作动态二维码出错
  20. android硬件抽象层(HAL)详解

热门文章

  1. 窃密恶意软件Raccoon最新样本Stealer v2分析
  2. 如何抠图更换背景?这两个方法你知道吗?
  3. 视觉SLAM②--初识SLAM
  4. CAD看图有什么技巧?怎么实现CAD快速看图?
  5. 求 人工智能及其应用 蔡自兴 徐光佑 版的
  6. 《Activiti 深入BPM工作流》---如何创建默认的activiti的25张表?
  7. Hack The Box - TIER 0 - Meow Fawn Dancing
  8. CPU卡程序设计实例(八)ESAM模块卡上、下电
  9. 正益移动:AppCan核心竞争力是开放的生态系统
  10. 26.微信小程序(WeUI框架)