hiho #1474 : 拆字游戏(dfs)@
来源:互联网 发布:c语言入门书籍下载 编辑:程序博客网 时间:2024/04/28 22:35
#1474 : 拆字游戏
时间限制:10000ms
单点时限:1000ms
内存限制:256MB
- 样例输入
14 2200000000000011111111000000000000001101101100000011000000111111110000001100000011011011000111111110001111111100011011011000000000000001101101100000110000000111111110001111111000000011000000000110000000001101100011111111000111111111000111111000000000001000110110110000000000000000011000000000000000000011100000
- 样例输出
10 90001100000001100001111111101101101101101101101111111100001100000001101101111111110000000105 811111111110110111111111111011011111111118 80011000011111110000110001111111101111110110110110001100000111000
描述
小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 1700000000000000000
00001111111100000
00000000000000000
00111111111111100
00000000100000000
00000010101110000
00000110100011000
00011100100001000
00000010100000000
00000001100000000
00000000000000000
1111111111111
0000001000000
0000001000000
0000001000000
0000001000000
0000001000000
0000011000000
3 4
0001
0011
1110
1 8
11111111
1 1
1
3 4
1110
0011
0001
这题特别容易超时,字符串读入快一些,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;}
0 0
- hiho #1474 : 拆字游戏(dfs)@
- #1474 : 拆字游戏
- c语言拆字游戏
- 拆字
- HIHO 组合游戏,学习
- hiho博弈游戏·Nim游戏
- hiho 44 博弈游戏·Nim游戏
- hiho一下 第五十四周 (缩点+dfs)
- HIHO #1049 : 后序遍历 (dfs)
- 拆字程序
- hiho一下 第四十四周 博弈游戏
- hiho~
- hihoCoder hiho一下 第四十四周 博弈游戏·Nim游戏
- [博弈论]hiho#1173 : 博弈游戏·Nim游戏·三
- hiho 45 博弈游戏·Nim游戏·二
- hiho 46 博弈游戏·Nim游戏·三
- hiho一下 第140周-清理海报(DAG+dfs)
- hiho一下 第156周 岛屿 (dfs)
- 03-上下文切换
- 习题 4-1 象棋
- MQTT入门级服务器搭建及简单通信源码
- PAT-B 1023. 组个最小数 (20)
- 遍历内核驱动模块
- hiho #1474 : 拆字游戏(dfs)@
- 数据结构之顺序表——C++模板类实现
- css三种插入方式
- 自定义视图---圆角柱状图(一)
- 随想
- 十六进制命令校验C代码
- shell(希尔)排序
- ListView嵌套GridView
- 注解方式实现aop事务切面