古代象形符号,Ancient Messages,UVA1103
题目链接:https://vjudge.net/problem/UVA-1103
题解:通过观察题目,所给的几个象形符号可以由每个图像所包围产生的洞洞来确定,统计dfs对图中的块进行染色,然后再统计每个图中的所包围的块数,其中比较坑的是将十六进制转为二进制以后,坐标会发生变化,然后会导致各种错误,我仔细改了好久才AC的。
代码:
#include<iostream>
#include<set>
#include<string>
#include<cstring>
#include<vector>
#include<algorithm>
#include<cstdio>
using namespace std;const int maxn = 200 + 10;string code[256];int H, W;
int pic[maxn][maxn];
int color[maxn][maxn];int dr[4] = { 0,0,1,-1 };
int dc[4] = { 1,-1,0,0 };void dfs(int row, int col, int c) {if (row < 0 || col < 3 || row > H+1 || col > 4*(W+1))return;color[row][col] = c;for (int i = 0; i < 4; i++) {int r0 = row + dr[i];int c0 = col + dc[i];if (pic[r0][c0] == pic[row][col] && color[r0][c0] == 0) {dfs(r0, c0, c);}}
}int main() {code['0'] = "0000";code['1'] = "0001";code['2'] = "0010";code['3'] = "0011";code['4'] = "0100";code['5'] = "0101";code['6'] = "0110";code['7'] = "0111";code['8'] = "1000";code['9'] = "1001";code['a'] = "1010";code['b'] = "1011";code['c'] = "1100";code['d'] = "1101";code['e'] = "1110";code['f'] = "1111";int kase = 0;//freopen("input.txt","r",stdin);while ((cin >> H >> W) && W && H) {int cnt = 0;vector<int> ss;memset(color, 0, sizeof(color));memset(pic, 0, sizeof(pic));for (int i = 1; i <= H; i++) {for (int j = 1; j <= W; j++) {char ch;cin >> ch;for (int p = 0; p < 4; p++) {pic[i][4 * j + p] = code[ch][p]-'0';}}}for (int i = 0; i <= H+1; i++) {for (int j = 3; j <= (4*(W+1)); j++) {if (color[i][j]==0) {dfs(i, j, ++cnt);if (pic[i][j] == 1)ss.push_back(cnt);}}}vector<set<int> > neighbor(cnt+1);for (int i = 1; i <= H; i++) {for (int j = 4; j <= (4*(W+1)-1); j++) {if (pic[i][j] == 1) {for (int p = 0; p < 4; p++) {int r = i + dr[p];int c = j + dc[p];if (r >= 1 && r <= H&&c >= 4 && c <= (4*(W+1)-1)&&pic[r][c] == 0 && color[r][c] != 1) {neighbor[color[i][j]].insert(color[r][c]);}}}}}string words = "WAKJSD";vector<char> output;for (int i = 0; i < ss.size(); i++) {output.push_back(words[neighbor[ss[i]].size()]);}sort(output.begin(), output.end());cout << "Case " << ++kase << ": ";for (int i = 0; i < output.size(); i++)cout << output[i];cout << endl;}return 0;
}
古代象形符号,Ancient Messages,UVA1103相关推荐
- UVA1103 古代象形符号 Ancient Messages解题报告(DFS,字符串)难度⭐⭐⭐⭐
题目翻译 为了识别3000年前古埃及用到的6种象形文字.每组数据包含一个H行W列的字符矩阵(H≤200,W≤50 ),每个字符为4个相邻像素点的十六进制(例如,10011100对应的字符就是9c).转 ...
- UVA1103 古代象形符号 Ancient Messages
首先是理解题意,这个刘汝佳写的很明白了,其实就是找1里面包着的有多少个0的连通块,不同的1的块互不干扰不相邻不包含,然后我就看uva上的例子,想把16进制化成2进制然后看是不是对的上,结果硬是对不上号 ...
- UVA 1103 - Ancient Messages(古代象形符号) By SuCicada
本题的目的是识别3000年前古埃及用到的6种象形文字,如图6-10所示. 图6-10 古代象形符号 每组数据包含一个H行W列的字符矩阵(H≤200,W≤50),每个字符为4个相邻像素点的 十六进制(例 ...
- Ancient Messages HDU - 3839
题目链接:Ancient Messages HDU - 3839 =================================================== Ancient Message ...
- UVA - 1103:Ancient Messages
Ancient Messages 来源:UVA 标签: 参考资料: 相似题目: 题目 In order to understand early civilizations, archaeologist ...
- 例题6-13 古代象形符号(Ancient Messages,World Finals 2011,UVa 1103)
原题链接:https://vjudge.net/problem/UVA-1103 分类:图 备注:思维 前言:说实话我确实自己写不出,写下面代码的时候对一下uDebug,不过我没有看作者代码了(早就看 ...
- Uva1103 古代象形符号
题目描述:题目很长,就贴一下题目连接吧=_=..https://vjudge.net/problem/UVA-1103 大意是输入一个H行W列的字符矩阵(H<=200, W<=50).每个 ...
- UVa1103古代象形符号
分析:这个题如果看透了他难度可以降低非常大的一部分,但如果看不透,那这个题会难的让人无奈.真是醉了,这 个题的重点在于每个图形的洞数,说得对.就是洞数,这是这几个符号唯一的差异,因为每个图形的洞数都不 ...
- 例题6-13 古代象形符号 UVa1103
1.题目描述:点击打开链接 2.解题思路:本题给出了一张图片的16进制的编码,要求找出这张图片中出现的符号.解码成二进制字符串后,实际上就是用普通的dfs解决了,不过如何进行dfs是本题的关键. 根据 ...
最新文章
- Leetcode 刷题笔记
- 转 安装php时报gd相关的错误(gd_ctx.c)
- Logger对象父子关系
- ReviewForJob——希尔排序(缩小增量排序)之塞奇威克增量序列
- 78.Subsets
- python有什么内容_python能做什么
- .net 实现Cookie跨域共享,单点登录SSO
- hexo html代码高亮,使用 prismjs 自定义 Hexo 代码高亮
- APPCAN学习笔记005---AppCan IDE安装下载,AppCan IDE启动
- Oracle中将小数转换成字符丢零.截取小数.除数为零解决法
- 基于javafx+sqlserver的仓库管理系统
- 微信h5棋牌以及下载类推广如何在微信中做好防封防屏蔽技术
- Arrays.sort(arr, (a, b) -> a - b)是对数组进行排序
- 大数据分析实战之异构数据源联合分析业务创新实践
- python+opencv实现文字颜色识别与标定
- Excel数据透视表的使用
- 【信号与系统】(六)连续系统的时域分析 ——冲激响应与阶跃响应
- 使用cmd命令导入导出数据库
- BI案例:BI在连锁零售业应用(ZT)【转】
- 学生会工作必备计算机知识,必备学生会工作总结范文合集九篇