UVA 1103

UVA1103 题意分析加思路讲解,DFS,详细~ 题目原文链接 题意: 很有意思的一道题,建议先去看完原文再回过头来看这篇博客。 大致意思是给出6种古埃及符号,输入一幅黑白图像的16进制表示,要求识别每幅图像中的符号并按照字典序输出。 6种古埃及符号如下图所示: 题目输入: 每组测试数据包含一个H行W列的字符矩阵(H≤200,W≤50)(H ≤ 200,W ≤50)(H≤200,W≤50),每个字符为4个相邻的像素点的十六进制 (例如:字符ccc对应的四个像素点就是110011001100),转化为二进制后的111表示黑点,000表示白点。 且输入满足: 阅读详情

一道DFS的题

首先需要将给的16进制数字字符转换为2进制数字字符

个人花费时间较多地方是  如何将多个文字所对应的空洞数与该文字对应上

这里给出一种方法,当然很多大神的题解也写过此方法

1.先给图像数组外围加一圈0,这是为了保证非文字包含的‘0’(背景‘0’),能构成连通块,以方便用dfs给它特异化掉,我是将‘0’换成‘x’

2.遍历图像,一旦找到‘1’(找到某1个文字),就就利用DFS抹掉这个连通块(文字),并在该DFS过程中遇到‘0'时,再另外用一个DFS抹掉文字中的空洞连通块,并计数

3.最后根据得到的空洞数,就可得到对应的输出字符,排序输出即可

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<iostream>
#include<cstdio>
#include<stack>

using namespace std;
#define MAXINDEX 110
#define MAXROW 805
#define MAXCOL 205

char* num_map[MAXINDEX];
char image[MAXROW][MAXCOL];

int dr[] = { -1,1,0,0 };
int dc[] = { 0,0,-1,1 };
char code[] = { 'W','A','K','J','S','D' };
int row, col;
string buf;
void init_map()//构建16进制与2进制编码映射
{
	num_map['0'] = "0000";
	num_map['1'] = "0001";
	num_map['2'] = "0010";
	num_map['3'] = "0011";
	num_map['4'] = "0100";
	num_map['5'] = "0101";
	num_map['6'] = "0110";
	num_map['7'] = "0111";
	num_map['8'] = "1000";
	num_map['9'] = "1001";
	num_map['a'] = "1010";
	num_map['b'] = "1011";
	num_map['c'] = "1100";
	num_map['d'] = "1101";
	num_map['e'] = "1110";
	num_map['f'] = "1111";
}
class _pair
{
public:
	int _r;
	int _c;
	_pair(int r, int c) :_r(r), _c(c){}
	_pair next(int dir) const
	{
		return _pair(this->_r + dr[dir], this->_c + dc[dir]);
	}
};
bool is_inside(const _pair &pair)//在图像外围加了一圈0(右边和下边),使得非文字的背景0能构成连通块,因此限制范围加1即可
{
	return pair._r >= 0 && pair._r <= row + 1 && pair._c >= 0 && pair._c <= 4 * col + 1;
}

void dfs_background(const _pair &start)
{
	stack<_pair> _stack;
	_stack.push(start);
	while (!_stack.empty())
	{
		_pair cur = _stack.top();
		_stack.pop();
		image[cur._r][cur._c] = 'x';//将文字背景特征化

		for (int i = 0;i != 4;++i)
		{
			_pair next = cur.next(i);
			if (is_inside(next) && image[next._r][next._c] == '0')
			{
				_stack.push(next);
			}
		}
	}
}
void dfs_word(const _pair &start, int &count)
{
	bool flag = false;
	stack<_pair> _stack;
	_stack.push(start);
	while (!_stack.empty())
	{
		_pair cur = _stack.top();
		_stack.pop();
		image[cur._r][cur._c] = 'x';//文字中的空洞标记为已访问

		for (int i = 0;i != 4;++i)
		{
			_pair next = cur.next(i);
			if (is_inside(next) && image[next._r][next._c] == '0')
			{
				_stack.push(next);
				flag = true;//标记为发现空洞
			}
		}
	}
	if (flag)
	{
		++count;
	}
}
void dfs(const _pair &start, int &count)
{
	stack<_pair> _stack;
	_stack.push(start);
	while (!_stack.empty())
	{
		_pair cur = _stack.top();
		image[cur._r][cur._c] = 'x';
		_stack.pop();

		for (int i = 0;i != 4;++i)
		{
			_pair next = cur.next(i);
			if (is_inside(next) && image[next._r][next._c] == '1')
			{
				dfs_word(next, count);
				_stack.push(next);
			}
		}
	}
}
void init_decode()//在图像外围加了一圈0(左边和上边),使得非文字的背景0能构成连通块
{
	for (int i = 0;i != row;++i)
	{
		cin >> buf;
		for (int j = 0;j != col;++j)
		{
			image[i + 1][4 * j + 1] = num_map[buf[j]][0];
			image[i + 1][4 * j + 2] = num_map[buf[j]][1];
			image[i + 1][4 * j + 3] = num_map[buf[j]][2];
			image[i + 1][4 * j + 4] = num_map[buf[j]][3];
		}
	}
}

int main()
{
	int n = 0;
	init_map();
	while (1)
	{
		memset(image, '0', sizeof(image));
		cin >> row >> col;
		if (!row && !col)
		{
			break;
		}
		int colsum = 4 * col;
		++n;
		init_decode();
		dfs_background(_pair(0, 0));
		string codes;
		for (int i = 0;i != row;++i)
		{
			for (int j = 0;j != colsum;++j)
			{
				if (image[i][j] == '1')
				{
					int cnt = 0;
					dfs(_pair(i, j), cnt);
					codes += code[cnt];
				}
			}
		}
		sort(codes.begin(), codes.end());
		printf("Case %d: %s\n", n, codes.c_str());
	}
	return 0;
}
虽说是非递归的DFS,但是速度不是很快,在UVA上是0.049s,我找了一个递归的DFS,速度0.019,相比慢了很多。

理论来说非递归要比递归要快一些,可能是因为构造函数拖慢了速度。

如果有大神知道哪里是速度瓶颈,请多多指教



UVA1103 古代象形符号 Ancient Messages 首先是理解题意,这个刘汝佳写的很明白了,其实就是找1里面包着的有多少个0的连通块,不同的1的块互不干扰不相邻不包含,然后我就看uva上的例子,想把16进制化成2进制然后看是不是对的上,结果硬是对不上号,上面有很多省略的行,弄的我是一头雾水,无奈去uDbug上面复制几个样例,输入转换一下才确定题意就是这么回事,然后开始想题, 一开始硬是想不起来,怎么才能确定一个0连通块是在1里面的,终于想到可以设置一个辅助的数组,一般这种dfs需要两个数组,一个存数据,一个存是否访问,现在我们遍历数组,一旦遇到一个1连通块, 阅读详情

相关推荐

EtherCAT应用层协议选型指南:CoE、SoE、EoE、FoE、AoE到底怎么选?看完这篇就懂了

本文深入解析EtherCAT应用层协议(CoE、SoE、EoE、FoE、AoE)的选型策略,从实时性、数据吞吐量和功能完整性三大核心指标出发,提供工业场景下的实战决策框架。通过技术特性对比、混合协议架构设计和常见故障规避指南,帮助工程师优化自动化设备通信性能。

weixin_28718793的博客 494

UVA1103 古代象形符号 Ancient Messages 题解

题目链接: https://www.luogu.org/problemnew/show/UVA1103 题目分析: 我们可以先进行矩阵的还原 for(int k=1;k<=4;k++) { a[i][++cnt]=(tmp>>(4-k))&1; } 这种使用for语句的方法在其他题解内貌似没有提及,(但其实就是...

ShineEternal的笔记小屋 730

STM32CubeMX+FreeRTOS+CAN总线+传感器实战:多任务系统与通信融合开发详解

本文详细介绍了基于STM32CubeMX和FreeRTOS的CAN总线与光电传感器融合开发实战。通过多任务系统设计,实现传感器数据采集与CAN通信的协同工作,提供完整的配置例程和调试技巧,适用于工业控制与机器人感知等应用场景。

n2o3p4的博客 735

Uva1103 World finals 2011——Ancient Messages

这题是2011年的World finals的题目。 判断由01矩阵组成的图像是属于哪个古埃及的文字。从6个图形可以看出,每一个图形里面的  空洞  都是不同的。可以从空洞的个数来判断属于哪个文字。 矩阵组成的每一个文字都是完整的,两个文字之间不会有连接。题目的给是01矩阵每四位构成的十六进制的矩阵,需要转换一下,这个不难。 01矩阵外围再围上一圈 的 0,一开始进行一次深搜dfs(0

XD 638

科研绘图避坑指南:用PyMol制作期刊级蛋白-配体相互作用图(含氢键显示技巧)

本文是一份专业的科研绘图避坑指南,详细讲解如何利用PyMol软件制作符合期刊发表标准的蛋白-配体相互作用图。文章重点分享了从构图逻辑、精准选择到氢键等相互作用的艺术化表达技巧,并提供了视觉优化与期刊适配的终极参数设置,帮助科研人员产出兼具科学严谨性与视觉美感的专业图表。

weixin_29292431的博客 270

ubuntu 18.04 + Kimera slam 安装与demo测试

环境:opencv 3.4.12,其他的都是按照文档下载的。 首先进行组件的安装 一、Kimera-VIO 安装参考文档:https://github.com/MIT-SPARK/Kimera-VIO/blob/master/docs/kimera_vio_install.md 按照文档装就好,在安装过程中碰到如下问题: 0、make 过程很卡,不要用所有的核 1、cmake过程中卡下载 ORBvoc.zip ,手动下载这个文件,解压,将里面的3个文件,放到/Kimera-VIO/vocabu.

dna葡萄糖的博客 3630

UVA- Ancient Messages 1103(dfs)

题目链接:https://cn.vjudge.net/problem/UVA-1103

GYH0730的博客 258

envi5.3处理高分二号影像数据详细过程记录

全文根据此篇文章进行数据处理: tm影像辐射定标_高分二号影像数据预处理及裁剪过程 其他参考: 学习笔记---遥感影像辐射定标与大气校正 利用ENVI自带全球DEM数据计算区域平均高程 高分二号数据处理流程(有高分二号的数据信息) GF2有多光谱和全色两个数据,MSS是多光谱的,PAN是全色的,多光谱的分辨率低,全色的高,需要把这两个数据融合,融合之前需要做定标等处理,获取经纬度。 一、多光谱影像处理 1. 辐射定标 以这个为例: 其他路径\2022.4.2...

ligous的博客 5万+

uva1103

题意:给你一个矩阵,让你识别图中的图片,然后字典序输出每个象形文字,图像可以拉伸,但是不能拉断 思路:每个象形文字的内部有不同的白洞,我们可以根据这里判断到底是哪个象形文字。然后问题转化成一个判断联通块的问题。 但是有个问题,如何区分里面的白洞和外面的白洞呢?我们可以将图扩大一圈,先把最外层的染色。 然后我们在搜索各个文字内部有几个白洞 给大家几个样例: 5 3 fff

nankeyimeng的博客 2026

Vivado XDMA仿真实战:从配置到链路训练全解析

本文深入解析了Vivado中XDMA IP核的仿真实战流程,重点剖析了PCIe链路训练状态机(LTSSM)的工作原理与调试方法。通过搭建仿真环境、解读日志与波形,手把手指导如何从配置、链路训练(LTSSM)到BAR映射与DMA启动进行全流程分析与问题定位,帮助工程师掌握核心调试技能,确保PCIe链路稳定与数据传输正确。

weixin_29197051的博客 154

在Matlab中开发AutoSAR模型的流程(自下而上)

前面介绍了AutoSAR软件组件开发的两种方式,其中自下向上的方式,是从模型出发,流程如下。

小胡同学的工程师学习之路 5367

Uva1103

题目地址: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=838&page=show_problem&problem=3544 分析: 这道题本质就是DFS求连通块,但是这道题并不单纯,涉及到: 输入格式的进制转化,16进制转化为二进制存储 求...

HJM916577的博客 387

ArcGIS Pro 3.4 二次开发 - 布局

本文介绍了在ArcGIS Pro SDK 3.4和.NET 8环境下操作布局工程项的相关方法。主要内容包括:引用布局工程项和关联布局,在新视图中打开或激活已有布局视图,引用活动布局视图,导入/移除布局工程项,创建基本布局或带参考线的自定义布局,修改布局页面尺寸,以及创建圆形图形元素等操作。重点演示了如何通过CIM(Core Infrastructure Model)进行高级布局配置,并详细说明了圆形图形元素的创建过程,包括几何构建、符号设置和图形生成。所有涉及UI线程的操作都遵循ArcGIS Pro SDK

Winemonk 795

UVA1103

这道题目刘汝佳的方式非常的巧妙 他将每一个区域,都涂成了一种颜色,然后只需要判断边界处的颜色有多少种就可以了 // UVa1103 Ancient Messages // Rujia Liu // we pad one empty line/column to the top/bottom/left/right border, so color 1 is always "backgro...

weixin_30437481的博客 112

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

UVA1103AncientMessage

复杂的DFS题,需要预处理的地方较多,且STL需要熟练!

qq_16603365的博客 286

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Uva1103 古代象形符号

题目描述:题目很长,就贴一下题目连接吧=_=。。https://vjudge.net/problem/UVA-1103 大意是输入一个H行W列的字符矩阵(H<=200, W<=50)。每个字符为4个相邻像素点的十六进制(即10011100对应的是9c),这样可以得到一副图片,然后找出图片中包含的题目中给出的六种象形符号是哪些。 思路:这是紫书上的一个例题,作者给出了一个重...

weixin_30919919的博客 223

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Ancient Messages UVA - 1103

题目链接:https://vjudge.net/problem/UVA-1103 题目大意:每组数据包含H行W列的字符矩阵(H<=200,W<=50) 每个字符为为16进制 你需要把它转化为二进制。 转化为二进制之后 1代表黑点 0代表白点 问你出现的所有符号 并按字典序输出! 思路:首先看到这道题,完全没看懂题意 ,真的没看懂,后来搜了题...

131

uva1103(dfs)

UVA - 1103 还是没写好,,看的别人的 1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <cstring> 5 #include <algorithm> 6 #include <cst...

weixin_30437337的博客 128

UVa 1103 古代象形符号 (Ancient Messages)

每组数据包含一个H行W列的字符矩阵(H<=200, W<=50) 每个字符为4个相邻像素点的十六进制,例如10011100对应的是9c 转化为二进制后1表示黑点,0表示白点。输入满足 不会出现下述六种符号之外的符号 输入至少包含一个符号,且每个像素都属于一个符号 每个符号都是一个四连块,并且不同的符号不会相互接触,也不会互相包含 如果两个黑像素对角,那么一定有一个元素在这两个元素中间...

Inuyasha__的博客 586

古代象形符号,Ancient Messages,UVA1103

题目链接:https://vjudge.net/problem/UVA-1103 题解:通过观察题目,所给的几个象形符号可以由每个图像所包围产生的洞洞来确定,统计dfs对图中的块进行染色,然后再统计每个图中的所包围的块数,其中比较坑的是将十六进制转为二进制以后,坐标会发生变化,然后会导致各种错误,我仔细改了好久才AC的。 代码: #include&lt;iostream&gt; #incl...

PAN_Andy的博客 665
上一篇: UVA 839
下一篇: 学霸的迷宫 经典BFS
ziscor
博客等级 码龄12年 3粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值