字符识别

成绩 0 开启时间 2013年02月21日 星期四 23:02
折扣 0.8 折扣时间 2013年02月28日 星期四 23:02
允许迟交 关闭时间 2013年02月28日 星期四 23:02
输入文件 charrec1.in 输出文件 charrec1.out
USACO/charrec(译 by Felicia Crazy)

描述

这个问题需要你写一个程序完成字符识别的任务。

每个完整的字符图案有 20 行,20 位。每个位是“0”“1”。图 1a 是输入文件中的符号图案的一部分。

输入文件charrec1.in的前541行包含了27个字符图案的信息,以这样的顺序记录:

_abcdefghijklmnopqrstuvwxyz

其中 _ 表示空格字符。每个完整字符长 20 行。

输入文件的其余部分包含一个或多个可能损坏的字符图案。一个字符图案可能以这些方式被损坏。

  • 最多有一行被可能被复制了(一定接在原来那一行的下面)
  • 最多有一行可能丢失了
  • 有些“0”可能被改成“1”
  • 有些“1”可能被改成“0”

不会有任何一个字符图案既多余了一行并且又丢失了一行。

被复制的那一行中,原来的行和多余的行可能都损坏了,而且损坏的部分可能并不相同。

写一个程序,使用输入文件提供的字体,在输入文件提供的图象中识别出一个或多个的字符序列。

使用提供的字体图象来识别字符的时候,要找出最佳的多余行或遗漏行,使找出的所有“0”“1”的变化数量最小。你必须确定和输入序列最接近的字符序列(就是损坏数据最少的那一个)。每个测试数据有唯一的最优解。

INPUT FORMAT (both input files)

    输入文件charrec1.in的第一行是一个正整数N1,描述了字体文件的行数(在所有的数据中N1=540)

    输入文件charrec1.in的第2~第541行是由0和1组成的字体文件,形如下图所示

(位1)(位2)(位3) ... (位20)

(位1)(位2)(位3) ... (位20)

...
输入文件charrec1.in的第542行是一个正整数N2,描述了要求识别的文件行数(19<N2<1200)

输入文件charrec1.in的第543~542+N2行是由0和1组成的文本文件,表示要求识别的文本,形式与字体文件相同。


字体文件和文本文件的每行有20位的宽度。在01之间没有空格分开。

OUTPUT FORMAT

你的程序必须建立一个输出文件,包含一个识别出来的字符串。它的格式是一个单行的 ASCII 文本。输出文件中不应该包含任何分隔符。

SAMPLE INPUT (file charrec1.in)

例:charrec1.in 开头(不完全的),有空格a

例:charrec1.in 的其余部分显示了一个损坏的a

charrec1.in的前若干行(部分)

charrec1.in的其余部分

540
00000000000000000000
00000000000000000000
00000000000000000000
00000000000000000000
00000000000000000000
00000000000000000000
00000000000000000000
00000000000000000000
00000000000000000000
00000000000000000000
00000000000000000000
00000000000000000000
00000000000000000000
00000000000000000000
00000000000000000000
00000000000000000000
00000000000000000000
00000000000000000000
00000000000000000000
00000000000000000000
00000000000000000000
00000000000000000000
00000000000000000000
00000011100000000000
00000111111011000000
00001111111001100000
00001110001100100000
00001100001100010000
00001100000100010000
00000100000100010000
00000010000000110000
00000001000001110000
00001111111111110000
00001111111111110000
00001111111111000000
00001000000000000000
00000000000000000000
00000000000000000000
00000000000000000000
00000000000000000000
19
00000000000000000000
00000000000000000000
00000000000000000000
00000011100000000000
00100111011011000000
00001111111001100000
00001110001100100000
00001100001100010000
00001100000100010000
00000100000100010000
00000010000000110000
00001111011111110000
00001111111111110000
00001111111111000000
00001000010000000000
00000000000000000000
00000000000001000000
00000000000000000000
00000000000000000000
1a 1b

SAMPLE OUTPUT (file charrec1.out)

a

 提示

1.少的一行不计算在变化数量内

2.对于多的一行,若第i+1行是第i行的重复,那么应计算第i行的变化数量而忽略第i+1行

3.原题称改变量不会超过30%(否则输出一个问号),但这个说法是错误的。你的程序不应在任何情况下输出问号,也不必判断改变量是否大于30%