2013-07-02 9 views
2

У меня есть строка, содержащая польскую нотацию, которая представляет план этажа (размещение VLSI), и содержит что-то вроде: «1234VHV56HV». (FYI, это означает: Отдельный 3 & 4 вертикально затем отделить результат & 2 по горизонтали затем отделить результат & 1 вертикально, отдельный 5 & 6 по горизонтали, а затем отделить предыдущие два результата по вертикали.)Получение цепочки писем из строки на основе определенной буквы

Предположим строку переменной называется: polishNotation. Буквы содержат ТОЛЬКО 'V' для вертикальной или 'H' для горизонтальной.

Я пытаюсь применить алгоритм, называемый: «Имитационное Отжиг» изменить польскую нотацию, поэтому я хочу, чтобы случайным образом выбирать индекс (что, конечно, меньше, чем polishNotation.Length) и если этот индексных пунктов к букве («V» или «H»), я хочу получить цепочку букв, включая ее, а затем изменить каждый «V» на «H» и изменить каждый «H» на «V» ... Другими словами : дополнить цепочку!

  • Например: Предположим, что польская нотация = «1234VHV56HV» и случайный индекс = 5, так что результат «Н» ... Я хочу, чтобы получить «VHV» и дополнить его стать: «1234HVH56HV».
  • Другой пример: предположим, что polishNotation = «1234VHV56HV» и случайный индекс = 9, поэтому результат «H» ... Я хочу получить «HV» и дополнить его, чтобы стать: «1234VHV56VH».
  • Другой пример: предположим, что polishNotation = «1234VHV56HV» и случайный индекс = 6, поэтому результат «V» ... Я хочу получить «VHV» и дополнить его, чтобы стать: «1234HVH56HV».

Надеюсь, я поняла ... Любые предложения? Я использую C# .net

+0

Если вы хотите получить ответы на C# вы можете захотеть добавить C# в качестве тега – doctorlove

ответ

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(); 
    } 
+0

Спасибо за ответ ... –

+0

Если это не ясно, дайте мне знать. – Michael