fork(2) download
  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4.  
  5. void ToPrint(int n, int m, int *currentNumberColumn, int *currentNumberRow, int symbolToPrint) {
  6. (*currentNumberColumn)++; // Инкрементируем значение номера столбца, так как есть символ на печать
  7. if (*currentNumberColumn > n) {
  8. cout << endl; // Переходим на новую строку
  9. (*currentNumberRow)++;
  10. *currentNumberColumn = 1;
  11. } // Если следует выполнить переход на следующую строку, выполняем этот переход по всем индексам
  12. if (*currentNumberRow > m)
  13. exit(0); // Заканчиваем работу программы, как только количество строк превышает заданное
  14. else if (symbolToPrint == 32 && *currentNumberColumn == 1) // В таблице ASCII 32 - пробел
  15. (*currentNumberColumn)--; // Возвращаем предыдущее значение номера столбца, так как ничего не было напечатано
  16. else if (symbolToPrint == 32)
  17. cout << char(symbolToPrint); // Выводим пробел, если это не начало строки
  18. else
  19. cout << symbolToPrint;
  20. }
  21.  
  22. int main() {
  23. int n, m; // Количество столбцов и строк соответственно
  24. cin >> n >> m;
  25. int start = 0; // Индекс элемента текущей цифры с которой ведется сравнение
  26. int quantity = 0; // Количество идущих подряд одинаковых элементов в данном члене
  27. int currentNumberRow = 1; // Номер текущей строки, в которой будет записан символ
  28. int currentNumberColumn = 0; // Номер текущего столбца, в который будет записан символ
  29. vector <short> currentTerm; // Вектор, хранящий значение текущего члена последовательности
  30. vector <short> previousTerm; // Вектор, хранящий значение предыдущего члена последовательности
  31. previousTerm.push_back(0); // Записываем в вектор предыдущего члена значение первого члена последовательности
  32. ToPrint(n, m, &currentNumberColumn, &currentNumberRow, 0); // Выводим первый член последовательности
  33. ToPrint(n, m, &currentNumberColumn, &currentNumberRow, 32); // Выводим пробел после него (если он не понадобится его уберет метод ToPrint)
  34. while (true) {
  35. for (int i = 0; i < previousTerm.size(); i++) {
  36. if (previousTerm[i] == previousTerm[start])
  37. quantity++; // Считаем количество идущих подряд одинаковых цифр
  38. else {
  39. currentTerm.push_back(quantity); // Записываем в вектор количество текущих цифр
  40. currentTerm.push_back(previousTerm[start]); // Записываем саму цифру
  41. ToPrint(n, m, &currentNumberColumn, &currentNumberRow, quantity);
  42. ToPrint(n, m, &currentNumberColumn, &currentNumberRow, previousTerm[start]); // Печатаем полученные данные
  43. start += quantity; // Переходим к следующей цифре для сравнения
  44. quantity = 1; // Присваиваем количеству одинаковых идущих подряд цифр 1, так как мы перешли к следующей цифре
  45. } // Если значение текущей цифры не совпадает с предыдущим, выполняем вывод и заполнение вектора следующего члена
  46. if (i == (previousTerm.size() - 1)) {
  47. currentTerm.push_back(quantity);
  48. currentTerm.push_back(previousTerm[start]);
  49. ToPrint(n, m, &currentNumberColumn, &currentNumberRow, quantity);
  50. ToPrint(n, m, &currentNumberColumn, &currentNumberRow, previousTerm[start]);
  51. } // Отдельный вывод для последнего элемента данного члена
  52. } // Цикл для прохода по всем цифрам предыдущего члена последовательности
  53. start = 0;
  54. quantity = 0; // Обнуляем все параметры для подсчета, так как дальше будем работать со следующим членом последовательности
  55. ToPrint(n, m, &currentNumberColumn, &currentNumberRow, 32); // Печатаем пробел после текущего члена последовательности
  56. previousTerm.clear();
  57. previousTerm = currentTerm; // Записываем в вектор предыдущего члена текущий построенный член последовательности
  58. currentTerm.clear();
  59. } // Бесконечный цикл, так как условие окончание работы программы задано в методе печати
  60. }
Success #stdin #stdout 0s 3420KB
stdin
10 10
stdout
0 10 1110 
3110 13211
0 11131221
10 3113112
22110 1321
1321322110
1113122113
1211132221
10 3113112
2211311123