题目链接:

https://www.luogu.org/problemnew/show/UVA1103

题目分析:

我们可以先进行矩阵的还原

for(int k=1;k<=4;k++)
{
a[i][++cnt]=(tmp>>(4-k))&1;
}

这种使用for语句的方法在其他题解内貌似没有提及,(但其实就是把anguei的化简了一下)

这样就能复原出原始的数据(01矩阵)

然后我们可以发现每一个象形文字都有可放缩性,但空白的个数是一定的。例如虫子图案就有4个空白处。

这样我们可以利用这一特性来解决问题了。

接下来用的算法是dfs乃至bfs入门都很常见的经典模型——水洼(或细胞个数)。

我们可以先判断与矩阵边缘联通的空白,全部消掉,然后剩下的空白就是文字中的了。

那么如何判断是哪个文字中的空白呢?

算法1:

刚开始,我是想先把每个文字复制一份到另一个数组里,那么在数组里经过边缘处理后剩下的空白联通块个数即为这个文字的个数。

但是后来发现没有必要。

算法2:

我们可以直接找黑点,找到一个开始扩张,扩张到的白点就是该文字的了。。。

还有就是千万不要犯一个错误:

输出的顺序是题目中图形出现的先后顺序而不是空白的个数为顺序。

endendend

代码:

//主要思路:先把二进制的01矩阵还原出来,记在a数组里,然后一一把每个象形文字单独放到b数组里,用从外向内缩0的办法找出在图形内的空白0,然后数出来,结束。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<string>
using namespace std;
int a[205][205];
int aa[5]={0,1,-1,0,0};
int bb[5]={0,0,0,-1,1}; int ans;
int jl[7];
int H,W;
char st[6]={'W','A','K','J','S','D'};
void pd(int xx,int yy)
{
a[xx][yy]=2;
for(int i=1;i<=4;i++)
{
int x=xx+aa[i];
int y=yy+bb[i];
if(x>0&&y>0&&x<=H&&y<=W&&a[x][y]==0)
{
a[x][y]=2;
pd(x,y);
}
}
}
void search(int xx,int yy)
{
a[xx][yy]=2;
for(int i=1;i<=4;i++)
{
int x=xx+aa[i];
int y=yy+bb[i];
if(x>0&&y>0&&x<=H&&y<=W&&a[x][y]!=2)
{ if(a[x][y]==0)
{
ans++;
pd(x,y);
}
else
if(a[x][y]==1) search(x,y); }
}
} int main()
{
char s[55];
int cntt=0;
while(~scanf("%d%d",&H,&W)&&H!=0&&W!=0)
{
memset(jl,0,sizeof(jl));
memset(a,0,sizeof(a));
ans=0;
cntt++;
for(int i=1;i<=H;i++)
{
cin>>s;
int cnt=0;
for(int j=1;j<=W;j++)
{
int tmp;
sscanf(s+j-1,"%1x",&tmp);
//printf("%1x",tmp);
//printf("\n");
for(int k=1;k<=4;k++)
{
a[i][++cnt]=(tmp>>(4-k))&1;
}
}
}
W*=4; /*for(int i=1;i<=H;i++)
{
for(int j=1;j<=W;j++)
{
printf("%d",a[i][j]);
}
printf("\n");
}*/
for(int k=1;k<=H;k++)
{
if(a[k][1]==0)pd(k,1);
if(a[k][W]==0)pd(k,W);
}
for(int k=1;k<=W;k++)
{
if(a[1][k]==0)pd(1,k);
if(a[H][k]==0)pd(H,k);
}
/* for(int qwq=1;qwq<=H;qwq++)
{
for(int qaq=1;qaq<=W;qaq++)
{
printf("%d",a[qwq][qaq]);
}
printf("\n");
}*/
for(int i=1;i<=H;i++)
{
for(int j=1;j<=W;j++)
{
/*printf("--------\n");
for(int qwq=1;qwq<=H;qwq++)
{
for(int qaq=1;qaq<=W;qaq++)
{
printf("%d",a[qwq][qaq]);
}
printf("\n");
}*/
if(a[i][j]==1)
{
//print();
ans=0;
search(i,j);
//printf("ans=%d\n",ans);
jl[ans]++;
//printf("ans=%d\n",ans);
}
/* for(int i=1;i<=H;i++)
{
for(int j=1;j<=W;j++)
{
printf("%d",a[i][j]);
}
printf("\n");
}*/
}
}
printf("Case %d: ",cntt);
for(int j=1;j<=jl[1];j++)
{
printf("%c",st[1]);
}
for(int j=1;j<=jl[5];j++)
{
printf("%c",st[5]);
}
for(int j=1;j<=jl[3];j++)
{
printf("%c",st[3]);
}
for(int j=1;j<=jl[2];j++)
{
printf("%c",st[2]);
}
for(int j=1;j<=jl[4];j++)
{
printf("%c",st[4]);
}
for(int j=1;j<=jl[0];j++)
{
printf("%c",st[0]);
}
printf("\n");//qaqqwqwedffg }
return 0;return 0;
}

撒花~

UVA1103 古代象形符号 Ancient Messages 题解的更多相关文章

  1. K - Ancient Messages(dfs求联通块)

    K - Ancient Messages Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Subm ...

  2. Uva1103 Ancient Messages

    题意:识别图中的象形文字.但是,图形可以任意的拉伸,但不能拉断. 分析:这种题如果图形没有特征是不可做类型的题,不过观察图形可以发现每个图形中的洞的数量是一定的,我们只需要数出每一个封闭图形的洞数就能 ...

  3. 6_13古代象形符号(UVa1103)<图的连通块的应用>

    给出一幅黑白图像,每行相邻的四个点压缩成一个十六进制的字符.然后还有题中图示的6中古老的字符,按字母表顺序输出这些字符的标号. 输出说明:For each test case, display its ...

  4. UVa 1103 Ancient Messages(二重深搜)

    In order to understand early civilizations, archaeologists often study texts written in ancient lang ...

  5. Ancient Messages UVA - 1103

    题目链接:https://vjudge.net/problem/UVA-1103 题目大意:每组数据包含H行W列的字符矩阵(H<=200,W<=50) 每个字符为为16进制  你需要把它转 ...

  6. Uva 1103 Ancient Messages

    大致思路是DFS: 1. 每个图案所包含的白色连通块数量不一: Ankh : 1 ;  Wedjat : 3  ; Djed : 5   ;   Scarab : 4 ; Was : 0  ;  Ak ...

  7. 【例题 6-13 UVA - 1103】Ancient Messages

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 每个图案里面的"洞"的个数都是不同的. 则可以根据这个判别每个图像是什么. 先用dfs确定轮廓之后. 再从每个白 ...

  8. HDU 3839 Ancient Messages(DFS)

    In order to understand early civilizations, archaeologists often study texts written in ancient lang ...

  9. hdu 3839 Ancient Messages (dfs )

    题目大意:给出一幅画,找出里面的象形文字. 要你翻译这幅画,把象形文字按字典序输出. 思路:象形文字有一些特点,分别有0个圈.1个圈.2个圈...5个圈.然后dfs或者bfs,就像油井问题一样,找出在 ...

随机推荐

  1. UWP入门(八)--几个简单的控件

    原文:UWP入门(八)--几个简单的控件 每天看几个,要不聊几天我就可以看完啦,加油! 看效果 1. CheckBox <TextBlock Grid.Row="0" Tex ...

  2. Natively Compiled Code: A Comeback?

    RAD Studio and Natively Compiled Code In today's development landscape, natively compiled code is ma ...

  3. 使用PNG实现半透明的窗体(使用GDI+)

      Delphi中标准控件是不支持png图片的,据说从Window2000后增加gdiplus.dll库处理更多的gdi图像,其中包括png.   关键的几个api   GdipCreateBitma ...

  4. 记录一次PHP项目报502的问题

    问题描述 最近有台服务器偶尔会报502错误,虽然量不多,每天就几十个,但是也必须得找到原因,避免让小问题变成大问题. 排查过程 502错误的原因,一般是对用户访问请求的响应超时造成的,一开始以为是请求 ...

  5. git如何merge github forked repository里的代码更新

    git如何merge github forked repository里的代码更新? 问题是这样的,github里有个项目ruby-gmail,我需要从fork自同一个项目的另一个repository ...

  6. Using VNC on a debian/Ubuntu server with a OS X Mac

    I got a brand new MacBook Pro 13" 2016. I used to work on GNU/Linux for decades. I don't want t ...

  7. ZooKeeper学习第三期---Zookeeper命令操作(转)

    转载来源:https://www.cnblogs.com/sunddenly/p/4031881.html 一.Zookeeper的四字命令 Zookeeper支持某些特定的四字命令字母与其的交互.他 ...

  8. 实战Java的反射机制

    众所周知,Java要调用某个对象的方法首先需要对象实例化后才能调用. 而实例化对象常见的就是new执行和spring(DI)的依赖注入了. Spring的DI其实就是以反射作为最基础的技术手段. 一. ...

  9. Python自学day-10

    一.多进程 程序中, 大量的计算占用CPU资源,而IO操作不占CPU资源.当程序需要进行大量计算时,Python采用多线程运行的速度不一定比单线程快多少.但是当程序是IO密集型的,那就应该使用多线程来 ...

  10. Hive 学习之路(八)—— Hive 数据查询详解

    一.数据准备 为了演示查询操作,这里需要预先创建三张表,并加载测试数据. 数据文件emp.txt和dept.txt可以从本仓库的resources目录下载. 1.1 员工表 -- 建表语句 CREAT ...