我正在C#中实现一个函数,它提供从哪一侧走什么样的行,它将从Unicode绘图表(0x2500-0x257F)中返回一个字符。但是我还没有(在)表中找到这些字符位置的系统,这会产生一个非常简单的功能,然后在一个巨大的if-then-else块中将所有可能的输入分配给输出。
我注意到该表中有9种不同的线型(细线,双线,粗线,双线,三点划线,四点三线,厚双点划线......),并且四个方向,“无线”信息使10个不同的状态,这将构成9999个不同的组合,不包括“没有一方有一条线”的情况,在我的情况下将是一个空格字符。
我发现实现这个的最简单的方法是制作一个包含所有10000种可能结果的巨大数组(其中第一个数字表示北,第二个数字表示东部,然后是南部和West)但我相信这实际上是我发现的第二个最糟糕的情况,并且有一个更优雅的解决方案。 (顺便说一句,如果你没有计划以这种方式实施它,那将会很有趣。不管怎样,这就是我对此的看法。)
这个问题在这里可能不合适,但考虑到这项任务的规模,我甚至承担了这个风险:
是否有一个系统框绘图表如何排列字符,和/或是否有一个更简单的算法,我想做的完全相同?
答案 0 :(得分:1)
我看到的最简单/最短的解决方案需要128个元素的数组/列表。
你声明一个这样的结构/类:
// 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;
}
当然,您可以添加对角线,圆角等,并以多种方式重构代码。我只给出了一个大致的想法。