hiho #1474 拆字游戏(dfs,记录状态)
#1474 : 拆字游戏
描述
小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
//
// Created by SeeKHit on 2017/3/5.
// #include "iostream"
#include "vector"
#include "algorithm"
#define MAX 505
using namespace std; char a[MAX][MAX];
int di[]={,-,,};
int dj[]={,,,-};
int n,m;
int n1=; //记录多少个块 vector<pair<int,int>> vv[*];//记录图形点的数组 void dfs(int i,int j,int id)
{
a[i][j]='x';
vv[id].push_back(make_pair(i-,j-));
int ar=;
for(int ii=;ii<;ii++)
{
int ni=di[ii]+i,nj=dj[ii]+j;
if(a[ni][nj]=='')
dfs(ni,nj,id);
}
} int vvv[][]; //记录字块
void Print(int id)
{
int cow=,rol=;
int maxx=,minx=1e9,maxy=,miny=1e9;
for(int t=;t<vv[id].size();t++)
{
maxx=max(maxx,vv[id][t].first);
minx=min(minx,vv[id][t].first);
maxy=max(maxy,vv[id][t].second);
miny=min(miny,vv[id][t].second); int x=vv[id][t].first;
int y=vv[id][t].second; }
rol=maxy-miny+;
cow=maxx-minx+;
cout<<cow<<" "<<rol<<endl; for(int t=;t<vv[id].size();t++)
{
int x=vv[id][t].first;
int y=vv[id][t].second; vvv[x-minx][y-miny]=; } for(int i=;i<cow;i++)
{
for(int j=;j<rol;j++)
{
cout<<vvv[i][j];
vvv[i][j]=; }
cout<<endl;
}
} int main()
{
scanf("%d %d",&n,&m);
for(int i=;i<n;i++)
scanf("%s",a[i+]+); for(int j=;j<=m;j++)
for(int i=;i<=n;i++)
{
if(a[i][j]=='')
{
n1++;
dfs(i,j,n1);
}
} for(int i=;i<=n1;i++)
{
Print(i);
}
}
hiho #1474 拆字游戏(dfs,记录状态)的更多相关文章
- Java设计模式学习记录-状态模式
前言 状态模式是一种行为模式,用于解决系统中复杂的对象状态转换以及各个状态下的封装等问题.状态模式是将一个对象的状态从该对象中分离出来,封装到专门的状态类中,使得对象的状态可以灵活多变.这样在客户端使 ...
- 2014 网选 广州赛区 hdu 5025 Saving Tang Monk(bfs+四维数组记录状态)
/* 这是我做过的一道新类型的搜索题!从来没想过用四维数组记录状态! 以前做过的都是用二维的!自己的四维还是太狭隘了..... 题意:悟空救师傅 ! 在救师父之前要先把所有的钥匙找到! 每种钥匙有 k ...
- 哈密顿绕行世界问题(dfs+记录路径)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2181 哈密顿绕行世界问题 Time Limit: 3000/1000 MS (Java/Others) ...
- BFS和DFS记录路径
DFS记录路径的意义好像不大,因为不一定是最短的,但是实现起来却很简单. #include<math.h> #include<stdio.h> #include<queu ...
- 历届试题 危险系数-(dfs+记录路径)
历届试题 危险系数 问题描述 抗日战争时期,冀中平原的地道战曾发挥重要作用. 地道的多个站点间有通道连接,形成了庞大的网络.但也有隐患,当敌人发现了某个站点后,其它站点间可能因此会失去联系. 我 ...
- Java实现 LeetCode 529 扫雷游戏(DFS)
529. 扫雷游戏 让我们一起来玩扫雷游戏! 给定一个代表游戏板的二维字符矩阵. 'M' 代表一个未挖出的地雷,'E' 代表一个未挖出的空方块,'B' 代表没有相邻(上,下,左,右,和所有4个对角线) ...
- 【hihocoder 1474】拆字游戏
[题目链接]:http://hihocoder.com/problemset/problem/1474 [题意] [题解] 题目的意思是说,那个块在最左端先出现,就先处理那个块; 每个连通块,处理出最 ...
- HDU 2209 翻纸牌游戏(DFS)
题目链接 Problem Description 有一种纸牌游戏,很有意思,给你N张纸牌,一字排开,纸牌有正反两面,开始的纸牌可能是一种乱的状态(有些朝正,有些朝反),现在你需要整理这些纸牌.但是麻烦 ...
- Unity游戏AI记录(2d横板为例)
using System.Collections;using System.Collections.Generic;using UnityEngine; public class GeneralPeo ...
随机推荐
- python高级篇
1.切片功能:类似于java中的split方法.对list或者triple中几个值进行取出的过程. L = ['a','b','c','d'] L[0:3] = ['a','b','c'] # ...
- logistics多分类
multiclassification #DATASET: https://archive.ics.uci.edu/ml/datasets/Glass+Identificationimport num ...
- .net 读取xml文件
xml 文件 <?xml version="1.0" encoding="utf-8" ?><root><name value=& ...
- PTA(Basic Level)1042.字符统计
请编写程序,找出一段给定文字中出现最频繁的那个英文字母. 输入格式: 输入在一行中给出一个长度不超过 1000 的字符串.字符串由 ASCII 码表中任意可见字符及空格组成,至少包含 1 个英文字母, ...
- [转帖]【JDK和Open JDK】平常使用的JDK和Open JDK有什么区别
https://www.cnblogs.com/sxdcgaq8080/p/7487369.html 其实不同的 openjdk的版本也不一样. atlassian说AdoptOpenJDK我们测试充 ...
- NumPy进阶
数组算术 任何两个等尺寸数组之间的算术操作都应用了逐元素操作的方式. arr1 = np.array([[1,2,3],[4,5,6]]) arr2 = np.array([[4,2,1],[7,2, ...
- round函数——银行家舍入算法
在处理四舍五入时,相信大部分人会使用math.round函数(不同的语言应该都有).有没有考虑过,这个函数是不是自己所需要的? po主碰到的问题是用来计算平均分.有个顶真的学生反映,明明是86.5,怎 ...
- 2016年蓝桥杯省赛C++A组 消除尾一
消除尾一: 下面的代码把一个整数的二进制表示的最右边的连续的1全部变成0如果最后一位是0,则原数字保持不变. 如果采用代码中的测试数据,应该输出: 00000000000000000000000001 ...
- pyhton sort()无返回值
li3=['] li4=li3.sort()#sort是没有返回值得,打印的是none,对列表进行升序排列 print(li4) print(li3) 输出结果是None['123', '123', ...
- 设计模式:策略模式(Stratege)
首先我们需要知道策略模式与状态模式是如此的相似,就犹如一对双胞胎一样.只不过状态模式是通过改变对象内部的状态来帮助对象控制自己的行为,而策略模式则是围绕可以互换的算法来创建成功业务的.两者都可用于解决 ...