所罗门的咒语

P3186 [HNOI2007] 所罗门的咒语

题目描述

所罗门的宝藏被一个强大的咒语封印着,只有用特殊的咒语才能打开。为了给后来人留下一线开启的希望,所罗门将开启宝藏的咒语隐藏在巨大的所罗门广场。

所罗门广场由边长为1米的正方形大理石板铺成,据说由于所罗门魔法的作用,在每个雷电交加的黎明,广场上的每块大理石板会发出不同的微弱的光芒,而那些亮度大于某个值的大理石板作为一个整体来看,就是开启所罗门宝藏的咒语,但由于年久失修,有的大理石板可能产生错误的亮度。

图1为在一个雷电交加的黎明从太空看所罗门广场的一个实例。通过所罗门的藏书可以知道,开启所罗门宝藏的咒语是由15种字符0,1,2,3,4,5,6,7,8,9,A,D,E,L,X中的若干个组成的长度小于10的符号串,这些符号按照从左到右的顺序大致排成一行,如图1所示。

现已在一个雷电交加的黎明搜集到所罗门广场上各块大理石板的亮度,亮度值用0到255的整数来度量,你能破译出开启所罗门宝藏的咒语么?

输入格式

第一行包含用一个空格隔开的2个整数L和H,其中L表示所罗门广场包含的大理石板的列数,5<=L<=100,H表示所罗门广场包含的大理石板的行数, 5<=H<=100。

接下来的H行,每行有L个由一个空格隔开的整数,不妨记接下来的第i行,第J列的整数为Vij,则有0<=Vij<=255。

输出格式

第一行为正整数t,表示咒语的长度。第2行为一个长度为t的字符串,表示识别出的咒语。

输入输出样例 #1

输入 #1

17 18
74 82 82 76 101 114 97 97 92 77 86 92 77 81 121 75 83
89 82 74 61 67 74 77 90 75 83 119 125 121 138 175 124 81
69 64 64 69 69 75 75 69 72 108 160 162 166 178 193 145 82
57 64 75 99 110 122 117 75 64 81 119 110 119 127 137 91 61
70 97 113 113 114 148 170 127 78 72 82 72 89 96 96 78 72
69 128 123 92 72 108 161 141 72 61 69 72 110 102 75 70 65
69 141 118 75 59 75 130 123 83 72 89 108 166 156 108 97 72
92 148 108 69 64 78 130 130 78 66 72 83 158 167 138 138 72
85 143 80 66 72 80 141 121 72 66 64 80 72 92 150 150 74
83 146 92 75 78 85 146 134 66 75 72 75 66 61 107 146 69
82 139 89 69 69 78 141 141 64 75 64 69 72 64 93 144 82
96 148 104 82 83 95 148 148 70 69 69 69 64 69 113 155 78
91 143 104 78 84 104 141 127 72 86 128 114 61 72 128 146 69
101 145 96 61 70 102 139 117 80 97 175 175 114 120 132 97 76
119 170 127 75 81 124 141 104 75 84 152 169 139 135 103 57 55
101 172 162 115 119 142 127 70 75 72 110 104 87 84 57 53 32
78 110 154 154 132 116 80 57 91 99 81 70 53 50 48 18 14
72 80 107 99 83 81 69 64 77 87 76 70 55 53 48 18 10

输出 #1

2
03

答案

这题的几个数据。

首先,第7张图有两种背景色。

第3张图坏了好大一块。

第四张图竟然是D

我建议不要用原来的毒瘤数据,造几个高清数据岂不美哉?
主要思想就是联通块。

首先弄出一个亮度分界线,这是难点。
或者按照亮度的变化程度而定。
我采用前者,我太蒟了。

亮度大于这个数的设为1,其他设为0

然后找出每个联通块,由于地砖会坏,所以要计算联通块平均大小,比这个小很多的就不是咒语。

**咒语“1”**根据身高和腰围判出来。

所以不讨论1

可以求出左轮廓线和右轮廓线,上半部分大小和下半部分大小。

还有横截面的1的个数,举个例子:

. . . . 1 1 1 1 . . . . . . 1 . .
. . . . . . . . . . 1 1 1 1 1 1 .
. . . . . . . . . 1 1 1 1 1 1 1 .
. . . 1 1 1 1 . . . 1 1 1 1 1 . .
. 1 1 1 1 1 1 1 . . . . . 1 1 . .
. 1 1 . . 1 1 1 . . . . 1 1 . . .
. 1 1 . . . 1 1 . . . 1 1 1 1 1 .
. 1 1 . . . 1 1 . . . . 1 1 1 1 .
. 1 . . . . 1 1 . . . . . 1 1 1 .
. 1 . . . . 1 1 . . . . . . 1 1 .
. 1 . . . . 1 1 . . . . . . 1 1 .
1 1 1 . . 1 1 1 . . . . . . 1 1 .
. 1 1 . . 1 1 1 . . 1 1 . . 1 1 .
1 1 1 . . 1 1 1 . 1 1 1 1 1 1 1 .
1 1 1 . . 1 1 1 . . 1 1 1 1 1 . .
1 1 1 1 1 1 1 . . . 1 1 . . . . .
. 1 1 1 1 1 . . . 1 . . . . . . .
. . 1 1 . . . . . . . . . . . . .
样例。

. . . 1 1 1 1 .
. 1 1 1 1 1 1 1
. 1 1 . . 1 1 1
. 1 1 . . . 1 1
. 1 1 . . . 1 1
. 1 . . . . 1 1
. 1 . . . . 1 1
. 1 . . . . 1 1
1 1 1 . . 1 1 1
. 1 1 . . 1 1 1
1 1 1 . . 1 1 1
1 1 1 . . 1 1 1
1 1 1 1 1 1 1 .
. 1 1 1 1 1 . .
. . 1 1 . . . .
0拍扁之后

(向左边掉落)
1 1 1 1
1 1 1 1 1 1 1
1 1 1 1 1
1 1 1 1
1 1 1 1
1 1 1
1 1 1
1 1 1
1 1 1 1 1 1
1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1 1
1 1 1 1 1
1 1
可以看到有两座山峰

(向下边掉落)
. . . . . . . .
. . . . . . . .
. 1 . . . . 1 .
. 1 . . . . 1 .
. 1 1 . . . 1 1
. 1 1 . . . 1 1
. 1 1 . . 1 1 1
. 1 1 . . 1 1 1
. 1 1 . . 1 1 1
. 1 1 . . 1 1 1
. 1 1 1 . 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
可以看到有两座山峰

为了避免锯齿可以做高斯模糊,然后根据差分数组判断有几座山。
给出一个正常的表(数据不正常):

咒语\ 向下边掉落:山峰个数\ 向左边掉落:山峰个数
0 2 2
1 不好判断 不好判断
2 不好判断 2
3 不好判断 3
4 1 1
5 不好判断 3
6 不好判断 3
7 不好判断 1
8 不好判断 不好判断
9 不好判断 不好判断
A 不好判断 1
D 不好判断 不好判断
E 1 3
L 1 1
X 不好判断 不好判断
根据上下两部分的分布密度也可以辅助判断。比如L和7

下面不讨论L和7。

还有洞的个数

咒语\ 洞的个数
0 1
1 0
2 0
3 0
4 1
5 0
6 1
8 2
9 1
A 1
D 1
E 0
X 0
咒语\ 向下边掉落:山峰个数\ 向左边掉落:山峰个数\ 洞的个数
0 2 2 1
2 不好判断 2 0
3 不好判断 3 0
4 1 1 1
5 不好判断 3 0
6 不好判断 3 1
8 不好判断 不好判断 2
9 不好判断 不好判断 1
A 不好判断 1 1
D 不好判断 不好判断 1
E 1 3 0
X 不好判断 不好判断 0
现在,不能判断的有:4,9,A,D,0和3,E,X,5。

我们根据左右两边的密度来判断,可以找出E和3,下面不讨论他们。

我们硬是求一下X向左边掉落的山峰个数,高斯模糊之后怎么也不会有3个,分出了X和5.

剩下4,9,A,D,0

这几个咒语都只有一个洞。

前面的4,9,A有一个共同点。

这样的两束平行光线,会有很大一片两束都照不到的地方而不是洞。

这就区分了4,9,A和D,0

D和0比较像,可以求出他们的左侧轮廓和右侧轮廓,比较曲度,相差大的就是D.

4,9,A的左轮廓线各不相同。

求出左轮廓线差分数组,变化幅度不大的就是A

4和9有点难判,可以利用向下边掉落的山峰轮廓。

如果变化幅度很大就是4,变化幅度小就是9.

程序不贴了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值