Паркет из треугольников C++

Прямоугольную комнату размерами M на N (сначала по горизонтали, а потом по вертикали) замостили треугольными плитками и их пронумеровали, как показано на рисунке.

За один шаг можно переместиться с одной паркетины на другую только через общую сторону. Найти наименьшее количество шагов, нужных для перемещения с паркетины A на паркетину B.

Входные данные

   Во входном файле в первой строке через пробел заданы значения MN (1 ≤ M, N ≤ 100), а во второй - AB.

Выходные данные

   Искомое количество шагов.

 

 

#include <iostream>
#include <vector>

using namespace std;

vector <pair<int, pair<int, pair<int, int>>>> vect;
pair<int, pair<int, int>> a, b;
int n, m, x, y, X, Y, TYPE, index = 0;
pair<bool, bool> mas[100][100];

void check(int xtmp, int ytmp, int valuetype, int value)
{
    if (0 <= xtmp && xtmp < n && 0 <= ytmp && ytmp < m)
    {
        if (valuetype)
        {
            if (mas[xtmp][ytmp].first == false)
            {
                vect.push_back(make_pair(value + 1, make_pair(valuetype, make_pair(xtmp, ytmp))));
                mas[xtmp][ytmp].first = true;
            }
        }
        else if (!valuetype)
        {
            if (mas[xtmp][ytmp].second == false)
            {
                vect.push_back(make_pair(value + 1, make_pair(valuetype, make_pair(xtmp, ytmp))));
                mas[xtmp][ytmp].second = true;
            }
        }
    }
}

int main()
{
    cin >> m >> n >> x >> y;

    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++) mas[i][j].first = mas[i][j].second = false;

    a.first = x % 2; x--;
    a.second.first = (x / 2) / m;
    a.second.second = (x / 2) % m;
    b.first = y % 2; y--;
    b.second.first = (y / 2) / m;
    b.second.second = (y / 2) % m;
    vect.push_back(make_pair(0, a));
    if (a.first) mas[a.second.first][a.second.second].first = true;
    else mas[a.second.first][a.second.second].second = true;
    while (vect[index].second != b)
    {
        X = vect[index].second.second.first;
        Y = vect[index].second.second.second;
        TYPE = vect[index].second.first;
        if (TYPE)
        {
            check(X - 1, Y, !TYPE, vect[index].first);
            check(X, Y - 1, !TYPE, vect[index].first);
            check(X, Y, !TYPE, vect[index].first);
        }
        else
        {
            check(X + 1, Y, !TYPE, vect[index].first);
            check(X, Y + 1, !TYPE, vect[index].first);
            check(X, Y, !TYPE, vect[index].first);
        }
        index++;
    }
    cout << vect[index].first << endl;
}

Назад

Повышение продаж с помощью веб-форм Разложение числа на простые множители Как качественный контент способствует продвижению сайта Как выбрать хостинг Как писать SEO-тексты? Что такое SEO оптимизация сайта


Хостинг

Есть решение которого нет на сайте? Пиши admin@devexe.top