2014-01-05 46 views
0

我在C#中實現了一個函數,從哪一邊開始提供哪一種線條,它將從統一碼錶中的框圖表格(0x2500-0x257F)返回一個字符。然而,我還沒有找到一個系統來處理這些字符在表格中的位置,這將使一個簡單得多的函數,然後將所有可能的輸入分配給一個巨大的if-then-else塊中的輸出。統一碼框圖表製表

我已經注意到該表中有9種不同的線條樣式(細線,雙線,粗線,雙線,三線,四線,三線,雙線)與四個方向一起,用「不行」信息做出10個不同的狀態,這將構成9999個不同的組合,不包括「沒有任何一方有行」的情況,這在我的情況下將是空格字符。

我發現實現這個的最簡單方式,是使一個包含所有10000可能的結果,一個刻着巨大的數組(其中第一個數字指出北,第二東,然後南,西),但我相信這實際上是我發現的第二個最糟糕的情況,並且有一個更加優雅的解決方案。 (順便說一下,如果你不打算以這種方式實施這個計劃,這將是很有趣的,這就是我對此的看法。)

這個問題可能不適合在這裏,但考慮到這個任務的大小,我甚至冒這樣的風險:

有沒有一個系統如何框圖表安排字符,和/或是否有一個更簡單的算法,做到了完全相同的,我想做的?

回答

1

我看到的最簡單/簡短的解決方案需要128個元素的數組/列表。

您聲明一個struct /類是這樣的:

// I use consts instead of enum to shorten the code below 
const int thin = 1; 
const int double = 2; 
const int thick = 3; 
... // other line styles 

struct BoxDrawingChar{ 
    int UpLine, DownLine, LeftLine, RightLine; 

    BoxDrawingChar(int UpLine, int DownLine, int LeftLine, int RightLine) 
    { ... } 
}; 

然後你描述每個角色的出現:

BoxDrawingChar[] BoxDrawingCharList = 
{ 
    new BoxDrawingChar(0, 0, thin, thin), // 0x2500 
    new BoxDrawingChar(0, 0, thick, thick), // 0x2501 
    ... 
    new BoxDrawingChar(...), // 0x257F 
} 

那麼你的功能將是相當簡單:

int GetCharCode(int UpLine, int DownLine, int LeftLine, int RightLine) 
{ 
    for(int i = 0; i < BoxDrawingCharList.Length; ++i){ 
     BoxDrawingChar ch = BoxDrawingCharList[i]; 
     if (ch.UpLine == UpLine && ch.DownLine == DownLine && ...) 
      return i + 0x2500; 
    } 
    return 0; 
} 

當然,你可以添加對角線,圓角等,並以許多方式重構代碼。我只給出了一個大概的想法。

+0

這其實是一個好主意,非常感謝!我不確定爲什麼沒有想到它。並且爲了解決並非所有組合都存在的事實(比如向下和向右虛線,或向上雙向向下),它可以被擴展爲無可用字符字段,該字段僅在沒有等效字符的情況下被設置。 –

+0

第二個想法是,從頭開始添加代碼,因爲它可能再次將其重新提升到10,000。儘管如此,我仍然很喜歡這種方法,並且想到如何解決這個問題。 –