时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

小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
#include <queue>
#include <vector>
#include <iostream>
using namespace std;const int dir[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
int n, m, mx, my, Mx, My;void floodfill(vector<vector<int>> &a, int x, int y)
{a[x][y] = 0;queue<pair<int, int>> q;q.push(make_pair(x, y));while (!q.empty()){auto p = q.front();q.pop();mx = min(p.first, mx);my = min(p.second, my);Mx = max(p.first, Mx);My = max(p.second, My);for (int i = 0; i < 4; i++){int xx = p.first + dir[i][0];int yy = p.second + dir[i][1];if (xx >= 0 && xx < n && yy >= 0 & yy < m && a[xx][yy] == 1){a[xx][yy] = 0;q.push(make_pair(xx, yy));}}}
}int main()
{freopen( "/home/liyuanshuo/ClionProject/hihocoder8/in.in", "r", stdin);cin >> n >> m;vector<vector<int>> a(n, vector<int>(m));for (int i = 0; i < n; i++)for (int j = 0; j < m; j++){char ch;cin >> ch;a[i][j] = ch - '0';}auto b = a;for (int i = 0; i < m; i++)for (int j = 0; j < n; j++)if (a[j][i]){mx = n; my = m; Mx = -1, My = -1;floodfill(a, j, i);cout << Mx - mx + 1 << ' ' << My - my + 1 << endl;for (int k = mx; k <= Mx; k++){for (int l = my; l <= My; l++)if (b[k][l] == 1 && a[k][l] == 0){b[k][l] = 0;cout << 1;}elsecout << 0;cout << endl;}}return 0;
}

#1474 : 拆字游戏相关推荐

  1. hiho #1474 : 拆字游戏(dfs)@

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

  2. hiho #1474 拆字游戏(dfs,记录状态)

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

  3. 【hihocoder 1474】拆字游戏

    [题目链接]:http://hihocoder.com/problemset/problem/1474 [题意] [题解] 题目的意思是说,那个块在最左端先出现,就先处理那个块; 每个连通块,处理出最 ...

  4. hihocoder offer收割编程练习赛8 B 拆字游戏

    思路: 模拟,dfs. 注意题目中的trick,输出一块的时候不要把其他块也输出了. 实现: 1 #include <cstring> 2 #include <iostream> ...

  5. PIPIOJ 1033: 拆字游戏 dfs连通分量

    题目: http://39.106.164.46/problem.php?id=1033 代码如下: #include<iostream> #include<algorithm> ...

  6. 1033: 拆字游戏

    题目描述 PiPi喜欢把别人的名字拆开来,比如"螺"就可以拆成"虫田糸",PiPi的语文学的不是很好,于是她决定使用编程的方式来解决这个问题. 给出一个01矩阵 ...

  7. hiho232周 拆字游戏

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

  8. 每日一题之 hiho232周 拆字游戏

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

  9. 2017 CVTE Windows开发一面 3.7

    下午3点接到了个广州打过来的电话,电话面试总体时间比较短,35分钟. 考察内容: 1.讲实习: 因人而异,将了之前公司做的项目,刚好和面的岗位匹配,面试官听完之后还不忘垂壁一下他们的产品. 2.C#事 ...

最新文章

  1. ajax走error的条件,Ajax进入ERROR的部分条件总结
  2. 川崎机器人示教盒维修_专业维修丹阳市KUKA库卡KRC2库卡C4主板维修{苏州罗韦维修}...
  3. c++面试题中经常被面试官面试的小问题总结(一)(本篇偏向基础知识)
  4. 好程序员Web前端教程分享Vue学习心得
  5. python小程序-整理了适合新手的20个Python练手小程序
  6. 【漏洞复现】ThinkPHP5 5.x 远程命令执行(getshell)
  7. 嵌入式linux 配置usb otg,嵌入式系统设计中的USB OTG方案
  8. 学习笔记(40):Python实战编程-文本
  9. 为《31天成为IT服务达人》征求正式名字
  10. 实战|手把手教你训练一个基于Keras的多标签图像分类器
  11. 阿里高级技术专家邱小侠:微服务架构的理论基础 - 康威定律
  12. vue 引入 less、scss、styles 全局样式变量
  13. c#中动态调用webService
  14. openGL绘制地球
  15. 加入合作伙伴计划应留意的5个危险信号
  16. 微信小程序分享朋友圈 详细教程及注意事项
  17. Java如何找出数组中前k个高频元素
  18. 五十三 九环山遇鬼(上)我在软件园的那些日子里
  19. python项目对接腾讯云发送短信
  20. 字库芯片GT20L16S1Y使用记录

热门文章

  1. 如何合并报表简单快速?
  2. 根治脱发和白发的中成药
  3. 面试汇总-Spring-IOC和AOP
  4. 爬虫篇-如何下载selenium及其适配谷歌浏览器插件chromedriver
  5. 芯片服务器培训,服务器介绍及培训.ppt
  6. “收到”的英语是Roger that 还是Copy that
  7. matlab中position函数,matlab有用的函数
  8. word/excel/cad中插入二维码
  9. 互联网下半场,实体店的转型思考
  10. (三)测试工具-3 adb安装卸载apk+清除数据