2

我有一个包含表示平面图(VLSI 布局)的波兰符号的字符串,它包含类似:“1234VHV56HV”的内容。(仅供参考,这意味着:垂直分离 3 和 4,然后水平分离结果和 2,然后垂直分离结果和 1,水平分离 5 和 6,然后垂直分离前两个结果。)

假设字符串变量被称为:PolishNotation。包含的字母只有“V”代表垂直或“H”代表水平。

我正在尝试应用一种称为“模拟退火”的算法来更改波兰表示法,所以我想随机选择一个索引(当然小于 PolishNotation.Length),如果这个索引指向一个字母('V ' 或 'H'),我想得到包含它的字母链,然后将每个 'V' 更改为 'H' 并将每个 'H' 更改为 'V'......换句话说:补充链!

  • 例如:假设 PolishNotation = "1234VHV56HV" 并且随机索引 = 5,所以结果是 "H"... 我想检索 "VHV" 并将其补充为:"1234HVH56HV"。
  • 另一个例子:假设 PolishNotation = "1234VHV56HV" 并且随机索引 = 9,所以结果是 "H"...我想检索 "HV" 并将其补为:"1234VHV56VH"。
  • 另一个例子:假设 PolishNotation = "1234VHV56HV" 并且随机索引 = 6,所以结果是 "V"...我想检索 "VHV" 并将其补全为:"1234HVH56HV"。

我希望我清楚自己...有什么建议吗?我正在使用 C#.net

4

1 回答 1

0

你可以试试这样的。我敢打赌有一种方法可以用正则表达式来做到这一点,但我不知道。

    string Complement(string floorPlan)
    {
        int index = rand.Next(floorPlan.Length); //get a random integer within array bounds

        if (floorPlan[index] != 'H' || floorPlan[index] != 'V') // if we didn't grab a letter, return
            return floorPlan;

        int start = index; //we'll need to find the start of the 'letter group'

        for (int i = index; i >= 0; i--) // work backwards through the string
            if (floorPlan[i] == 'H' || floorPlan[i] == 'V') // updating if we find another letter
                start = i;
            else // break when we don't
                break;            

        StringBuilder sb = new StringBuilder(floorPlan); // use a string builder for ease of char replacement

        for (int i = start; i < floorPlan.Length; i++) // using the start index, interate through
            if (floorPlan[i] == 'V') // and replace accordingly
                sb[i] = 'H';
            else if (floorPlan[i] == 'H')
                sb[i] = 'V';
            else // breaking when we encounter a number
                break;

        return sb.ToString();
    }
于 2013-07-02T12:56:13.893 回答