Матч 404, Обнаружить треугольник (RevealTriangle)

Дивизион 2, Уровень 2; Дивизион 1, Уровень 1

 

Рассмотрим треугольник цифр:

74932

1325

457

92

1

Каждая цифра, которая находится не в первом ряду, равна последней цифре суммы соседних цифр, стоящих строго сверху и сверху справа.

На вход подается массив строк questionMarkTriangle, содержащий указанный треугольник цифр. В каждой строке все цифры кроме одной заменены на символ ‘?’. Вернуть восстановленный треугольник (заменить все знаки ‘?’ на искомые цифры).

 

Класс: RevealTriangle

Метод: vector<string>

             calcTriangle(vector<string> questionMarkTriangle)

Ограничения: questionMarkTriangle содержит от 1 до 50 элементов, i – ый элемент questionMarkTriangle (нумерация начинается с 0) содержит n – i символов ‘0’ – ‘9’ и ‘?’, где n – число элементов в questionMarkTriangle.

 

Вход. Массив строк questionMarkTriangle.

 

Выход. Восстановленный треугольник цифр.

 

Пример входа

questionMarkTriangle

{"4??",

"?2",

"1"}

{"???2", "??2", "?2", "2"}

{"??5?", "??9", "?4", "6"}

 

Пример выхода

{"457", "92", "1"}

{"0002", "002", "02", "2"}

{"7054", "759", "24", "6"}

 

 

РЕШЕНИЕ

обработка массива

 

Занесем таблицу цифр в символьный массив m. Занесем в ячейку pos[i] номер позиции i - ой строки, в которой находится цифра. Последняя строка содержит одно число, поэтому в ней нет символов ‘?’. Будем восстанавливать треугольник, начиная с предпоследней строки до первой (цикл по i). В первом цикле по j восстанавливаем цифры, находящиеся правее ячейки pos[i], во втором – цифры, находящиеся левее pos[i].

Рассмотрим, как восстановить цифру в ячейке m[i][j]. Изначально в ней находится ‘?’. Пусть, например, в ячейке слева m[i][j – 1] уже находится цифра (это будет иметь место при pos[i] < j). В ячейке снизу m[i + 1][j – 1] также находится цифра. Имеет место соотношение:

m[i + 1][j – 1] = (m[i][j – 1] + m[i][j]) mod 10

Откуда

m[i][j] = (m[i + 1][j – 1] – m[i][j – 1] + 10) % 10

Преобразовываем восстановленную таблицу цифр m в массив строк res, которую и возвращаем. Поскольку массив m символьный, то получить результирующие строки res[i] можно при помощи конструктора string.

 

ПРОГРАММА

 

#include <cstdio>

#include <vector>

#include <string>

using namespace std;

 

class RevealTriangle

{

public:

  vector<string> calcTriangle(vector<string> questionMarkTriangle)

  {

    int i, j, pos[50], n = questionMarkTriangle.size();

    char m[50][50];

    vector<string> res(n);

    for(i = 0; i < n; i++)

      for(j = 0; j < questionMarkTriangle[i].size(); j++)

      {

        m[i][j] = questionMarkTriangle[i][j];

        if (m[i][j] != '?') pos[i] = j;

      }

    for(i = n - 2; i >= 0; i--)

    {

      for(j = pos[i] + 1; j < n - i; j++)

        m[i][j] = (m[i+1][j-1]-m[i][j-1] + 10) % 10 + '0';

      for(j = pos[i] - 1; j >= 0; j--)

        m[i][j] = (m[i+1][j]-m[i][j+1] + 10) % 10 + '0';

    }

    for(i = 0; i < n; i++)

      res[i] = string(m[i],0,questionMarkTriangle[i].size());

    return res;

  }

};