我有一个任务要解决它,我解决了它,但似乎我的算法有点复杂,所以我想听听解决这个问题的其他方法。
这是任务:
在文本文件中有绘制的线条|。 _, - ,/和\和它们以表示数字编号的方式绘制,例如线条|一个低于另一个代表数字1。
以下是文件内容:
--- --- | | | -----
/ __| | |___| |____
\ | | | |
--- --- | | ____|
| | | -----
| |___| |____
| | |
| | ____|
所以,我需要一种算法来读取这些行并识别数字并将它们作为整数返回。它不必是任何语言,编写的伪代码是可以的,但也欢迎使用C#,Java或VB.net编写的算法。
谢谢!
P.S。对不起我的英语。
答案 0 :(得分:0)
我建议您将可能的数字列表存储为某种签名。这是一个代表该数字的字符串。
Dim numbers As New List(Of String)
numbers.Add("||||") ' 1
numbers.Add("---__|| ---") ' 2
numbers.Add("--- / \---") ' 3
numbers.Add("| ||___| | |") ' 4
numbers.Add("-----|____ |____|") ' 5
一次读取4行文件。确保跳过所有空行。我希望所有的线都有相同的宽度。
Dim lines As New List(Of String)
lines.add("--- --- | | | -----")
lines.add(" / __| | |___| |____")
lines.add(" \ | | | |")
lines.add("--- --- | | ____|")
循环每列的所有列,循环所有可能的数字大小。在每个循环中,找到可能的签名。查看该签名是否属于您的初始列表。
For column As Integer = 0 To lines(0).Length - 1
If Not IsColumnEmpty(lines, column) Then
For digitSize As Integer = 1 To 5
' Don't overflow
If column + digitSize > lines(0).Length Then
Exit For
End If
Dim signature As String
signature = GetSignature(lines, column, digitSize)
If numbers.Contains(signature) Then
Console.Write(numbers.IndexOf(signature) + 1)
column += digitSize ' Skip all columns that are part of this number
Exit For
End If
Next
End If
Next
' We want to skip empty columns
Function IsColumnEmpty(ByVal lines As List(Of String), ByVal column As Integer) As Boolean
Dim isEmpty As Boolean = True
For Each line As String In lines
If line(column) <> " " Then
isEmpty = False
End If
Next
Return isEmpty
End Function
' startingColumn and columnSize represent a square of data inside the 2d array. Convert that square into a 1d string
Function GetSignature(ByVal lines As List(Of String), ByVal startingColumn As Integer, ByVal columnSize As Integer)
Dim signature As String = ""
For Each line As String In lines
signature &= line.Substring(startingColumn, columnSize)
Next
Return signature
End Function
答案 1 :(得分:0)
我对这个问题的处理方法是考虑每个数字如矩阵(例如:我们样本中的数字1是矩阵,维数为1x4),并且数字编号中的每一行都有自己的坐标。在该矩阵中,我想找到并计算所有方向变化的数量(方向变化意味着两条不同的线连接在一起,例如:对于数字2,我们有4个方向变化)并确定矩阵中的确切位置(左上,右-top,right-middle,left-down,...)所以当我有方向改变的数量时,有什么样的方向改变(例如:| _是左下角),以及它们的位置,我可以识别一个数字(例如,数字2有4个方向改变,它们是:右上角位于右上角位置,右上角位于中右位置,左上角位于中左位置和左下角左下角位置,1号没有方向变化,所有线都相等|等等)。我之所以选择这种算法是因为,只要它们连接正确并且每个数字都是正确分开的,那么绘制数字的行数并不重要。