#1474 : 拆字游戏

时间限制: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

这题特别容易超时,字符串读入快一些,dfs时不用开标记数组,直接改变原矩阵

#include<bits/stdc++.h>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long LL;
const int N = 505;
char s[N][N];
int vis[N][N];
int dir[4][2]= {{-1,0},{1,0},{0,1},{0,-1}};
struct node
{int n, m, x1, yy1, x2, y2;bool flag[N][N];
}p;
int x1, yy1, x2, y2;
void dfs(int x,int y,int n,int m)
{for(int i=0; i<4; i++){int a=x+dir[i][0], b=y+dir[i][1];if(a<0||a>=n||b<0||b>=m||vis[a][b]||s[a][b]=='0') continue;p.flag[a][b]=1, s[a][b]='0';if(a<x1) x1=a;if(a>x2) x2=a;if(b<yy1) yy1=b;if(b>y2) y2=b;dfs(a,b,n,m);}return ;
}int main()
{int n, m;while(scanf("%d %d", &n, &m)!=EOF){for(int i=0; i<n; i++)scanf("%s",s[i]);for(int i=0; i<m; i++){for(int j=0; j<n; j++){if(s[j][i]=='1'){memset(p.flag,0,sizeof(p.flag));x1=j, yy1=i, x2=j, y2=i;dfs(j,i, n, m);p.n=x2-x1+1, p.m=y2-yy1+1;p.x1=x1, p.x2=x2,p.yy1=yy1,p.y2=y2;p.flag[j][i]=1;printf("%d %d\n",p.n,p.m);for(int j=p.x1; j<=p.x2; j++){for(int k=p.yy1; k<=p.y2; k++){putchar('0'+p.flag[j][k]);}printf("\n");}}}}}return 0;
}

hiho #1474 : 拆字游戏(dfs)@相关推荐

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

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

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

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

  3. #1474 : 拆字游戏

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

  4. 【hihocoder 1474】拆字游戏

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

  5. SDOI2015寻宝游戏 dfs序+set

    SDOI2015寻宝游戏 好像是一道虚树入门题? 虚树???不会不会我弱死了.. Solution: 关键点间的最小路径,就是在保证尽量少走重复路的前提下走出来的一条经过所有关键点的路径. 基于这个思 ...

  6. cdoj 1252 24点游戏 dfs

    24点游戏 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/1252 Descr ...

  7. 水管工游戏——dfs

    问题描述: 水管工游戏是指如下图中的矩阵中,一共有两种管道,一个是直的,一个是弯的,所有管道都可以自由旋转,最终就是要连通入水口可出水口.其中的树为障碍物. 方案: 输入格式:输入的第一行为两个整数N ...

  8. HDU 2209 翻纸牌游戏(DFS)

    题目链接 Problem Description 有一种纸牌游戏,很有意思,给你N张纸牌,一字排开,纸牌有正反两面,开始的纸牌可能是一种乱的状态(有些朝正,有些朝反),现在你需要整理这些纸牌.但是麻烦 ...

  9. 2021.8.12携程笔试第三题:建树游戏DFS

    2021.8.12携程笔试 讨论区 在做最后一题的时候把题意看错了,悔之莫及,故记录此文引以为戒! 建树游戏 问题描述 有n个节点和n-1条边,形成一棵树,每个节点有一个权值.把其中一条边删除就形成了 ...

最新文章

  1. 五点讲述C++智能指针的点点滴滴
  2. Apache软件历史版本下载地址
  3. 八大排序算法图文讲解
  4. javascript:使用document.getElementById读取数据为空分析
  5. 家庭财务管理系统_我31岁,30天整理出这些财务笔记干货,从宝妈成功逆袭成为会计...
  6. leetcode 剑指 Offer 05. 替换空格
  7. 关于印象笔记“本笔记只能查看。它是从另一笔记创建的”
  8. Kafka的rebalance机制
  9. 2dpsk差分相干解调matlab,基于systemview和matlab的2DPSK
  10. github 代理_GitHub访问提速方法
  11. Redis应用(一)——Windows系统中搭建并启动redis环境
  12. 分享github好用的磁力站bt导航和阿里云盘导航、百度网盘搜索引擎导航
  13. linux服务器root密码忘记怎么办,Linux忘记root密码怎么办?
  14. 大数据告诉你,中国哪里出美女
  15. 高通Thermal debug
  16. 人生就是不断地战斗。 --王者荣耀之宫本武藏
  17. 015A VLAN间路由
  18. 百度地图 JavaScript API ios不能使用情况
  19. Docker容器无法启动,里面的配置文件如何修改
  20. Matlab从入门到精通(一)

热门文章

  1. MongoDB 概念解析
  2. 基于python的图书管理系统
  3. festival - ubuntu下的TTS引擎
  4. Image Retrieval: Ideas, influences, and trends of the new age 图像检索综述 文献翻译(一)
  5. can only concatenate str (not “NoneType“) to str
  6. DARKHOLE: 2
  7. 要玩大数据,没有数据怎么玩?这里推荐一些33款开源爬虫软件给大家。
  8. macbook上好用的解压软件_macbook上怎么用解压软件解压?用什么解压软件好?
  9. catia投图只投外轮廓线_CATIA自动投图使用说明(自动出工程图)
  10. Problem 3: 人造卫星的高度