Перестановки букв и чисел в номере телефона

Я чаще всего использую его, когда я должен повредить чей-либо (обычно платформа) инкапсуляция. Таким образом, я должен изменить некоторое частное поле, или назвать закрытый метод или создать экземпляр некоторого внутреннего класса в библиотеке, которую я не имею никакого права изменять. Хорошим примером является код в мой ответ к этот вопрос . В этом случае поведение метода платформы ServiceBase.Run было недопустимо, таким образом, я использовал отражение, чтобы сделать то же самое, это делает более приемлемым способом.

Отражение имеет много другого использования, тем не менее, включая утка, вводящая , работающая с атрибуты , и позднее связывание .

5
задан Bill the Lizard 18 September 2012 в 03:16
поделиться

3 ответа

Что ж, если вам не нужно решение, я бы реализовал его так:

Используйте вектор V с каждым элементом, взятым из строки. Например, если это 23, то ваш вектор V будет иметь два вектора, каждый из которых содержит 2ABC и 3DEF.

Итерируйте каждую цифру, как счетчик, по соответствующей строке. Двигайтесь справа налево, и когда каждая цифра переполняется, увеличивайте единицу влево, сбрасывайте и т. Д.

Отображайте счетчик на каждой итерации, чтобы получить свое «число».

4
ответ дан 18 December 2019 в 09:51
поделиться

Подсказка по компиляции ошибок:

  1. нет файла называется в STL. это должно быть
  2. Проблема связана с функцией getLetters . multimap lmap передано по постоянной ссылке. Следовательно, API equal_range на lmap вернет пару const_iterator , а не только итератор .
4
ответ дан 18 December 2019 в 09:51
поделиться

Как насчет следующего:

#include <cstddef>
#include <iostream>
#include <iterator>
#include <string>
#include <algorithm>

template <typename Iterator>
bool next_combination(const Iterator first, Iterator k, const Iterator last);

int main()
{
   std::string phone_number = "23";

   std::string number[] = {
                            "0",   "1",  "2abc", "3def",  "4ghi",
                            "5jkl","6mno", "7pqrs", "8tuv","9wxyz"
                          };

   std::string tmp_set;
   std::string set;

   for(std::size_t i = 0; i < phone_number.size(); ++i)
   {
      tmp_set += number[static_cast<std::size_t>(phone_number[i] - '0')];
   }
   std::sort(tmp_set.begin(),tmp_set.end());

   std::unique_copy(tmp_set.begin(),
                    tmp_set.end(),
                    std::back_inserter(set));

   std::string current_set;
   current_set.reserve(phone_number.size());

   do
   {
      std::copy(set.begin(),
                set.begin() + phone_number.size(),
                std::back_inserter(current_set));
      do
      {
         std::cout << current_set << std::endl;
      }
      while (std::next_permutation(current_set.begin(),current_set.end()));
      current_set.clear();
   }
   while(next_combination(set.begin(),
                          set.begin() + phone_number.size(),
                          set.end()));
  return 0;
}


   template <typename Iterator>
   inline bool next_combination(const Iterator first, Iterator k, const Iterator last)
   {
      /* Credits: Thomas Draper */
      if ((first == last) || (first == k) || (last == k))
         return false;
      Iterator itr1 = first;
      Iterator itr2 = last;
      ++itr1;
      if (last == itr1)
         return false;
      itr1 = last;
      --itr1;
      itr1 = k;
      --itr2;
      while (first != itr1)
      {
         if (*--itr1 < *itr2)
         {
            Iterator j = k;
            while (!(*itr1 < *j)) ++j;
            std::iter_swap(itr1,j);
            ++itr1;
            ++j;
            itr2 = k;
            std::rotate(itr1,j,last);
            while (last != j)
            {
               ++j;
               ++itr2;
            }
            std::rotate(k,itr2,last);
            return true;
         }
      }
      std::rotate(first,k,last);
      return false;
   }
9
ответ дан 18 December 2019 в 09:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: