Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
1 / 1 / 0
Регистрация: 04.11.2017
Сообщений: 58
1

Гарри Поттер и магические шахматы [C, B’] - массивыыыыыы

29.08.2019, 22:53. Показов 1592. Ответов 1
Метки нет (Все метки)

Гарри, Рон и Гермиона попали на шахматное поле. Пустое. С загадочными числами. Гермиона,
мысленно пролистывая страницы книг, отпечатанные в памяти, быстро поняла, что это древняя
магическая головоломка, которой Сами-Знаете-Кто решил их замедлить.
А заключается она в следующем: злой волшебник создает магическое шахматное поле (состоящее
из n строк и m столбцов) и проставляет во всех его клетках не менее магические нули. Затем он
выбирает одну клетку, пишет в ней какое-то положительное целое число и ставит на нее магического
ферзя. Ферзь делает k ходов и исчезает. Несмотря на то, что ферзь магический, двигается он как
обычный шахматный ферзь. При этом при каждом новом передвижении ферзь выбирает еще не
использованную клетку (т.е. ту, в которой он раньше не бывал) и пишет в ней число, большее
предыдущего (т. е. больше числа, записанного в его текущей клетке) и переходит в нее.
Для решения головоломки нужно лишь восстановить передвижения ферзя по полю, либо выяснить, что Сами-Знаете-Кто наколдовал какую-то неправильную волшебную доску.


Формат входных данных
В первой строке заданы числа n, m и k (1 <= n, m <= 300, 0 <= k < n · m). Последующие n строк
содержат по m чисел (каждое из которых неотрицательно и не превосходит 10^9)
).

Формат выходных данных
Если Сами-Знаете-Кто наколдовал неправильную доску, выведите «Wrong Board». Если же головоломка имеет решение, выведите n строк по m чисел каждая, где любое положительное число
обозначает номер хода, перед которым ферзь побывал в этой клетке, 0 означает, что клетка не
занята, а число k + 1 обозначает последнюю клетку, в которой побывал ферзь.

Примеры
Ввод:
3 2 3
1 2
0 0
4 3
Вывод:
1 2
0 0
4 3



Ввод:
2 2 3
11 23
40 25
Вывод:
1 2
4 3


Ввод:
2 2 2
11 23
40 25

Вывод:
Wrong Board
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.08.2019, 22:53
Ответы с готовыми решениями:

Гарри Поттер искал философский камень, который был спрятан на координатном поле. Гарри не знал координаты камня, поэтому ходил спонтанно по полю
Вам необходимо помочь Гарри Поттеру найти философский камень. Для этого нужно по описанию...

Гарри Потер
Гарри Поттер и его друзья с факультета Гриффиндор школы Хоггвардса должны для выполнения своей...

Подскажите хронологию книг Гарри Гаррисон ?
Подскажите хронологию книг Гарри Гаррисон Нужно с начало читать серию книг про стальную крысу или...

Магические цифры((
где-то нашёл инит таймера 2-х байтного .equ TimerDivider = 60000 clr r16 STS TCNT1H, r16...

1
812 / 500 / 210
Регистрация: 19.01.2019
Сообщений: 1,196
30.08.2019, 17:17 2
Лучший ответ Сообщение было отмечено Xait как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <iostream>
#include <map>
 
int main()
{
    uint16_t n, m;
    uint32_t k;
    std::cin >> n >> m >> k;
    std::map<uint32_t, std::pair<uint16_t, uint16_t>> map;
    uint32_t buff;
    
    for (uint16_t i = 0; i < n; ++i) {
        for (uint16_t j = 0; j < m; ++j) {
            std::cin >> buff;
            if (buff != 0) {
                map.emplace(buff, std::pair<uint16_t, uint16_t>(i, j));
            }
        }
    }
    if (map.size() != k + 1) {
        std::cout << "Wrong Board";
        return 0;
    }
    uint32_t* arr = new uint32_t[n * m]{ 0 };
    size_t cnt = 0;
    std::pair<uint16_t, uint16_t> prev = map.begin()->second;
    std::map<uint32_t, std::pair<uint16_t, uint16_t>>::iterator it;
    for (it = map.begin(); it != map.end(); ++it) {
        if (
            it->second.first != prev.first &&
            it->second.second != prev.second &&
            abs((int)prev.first - (int)it->second.first) != abs((int)prev.second - (int)it->second.second)
            ) {
            break;
        }
        arr[it->second.first * m + it->second.second] = ++cnt;
        prev = it->second;
    }
    if (it != map.end()) {
        std::cout << "Wrong Board";
        return 0;
    }
    
    for (uint16_t i = 0; i < n; ++i) {
        for (uint16_t j = 0; j < m; ++j) {
            std::cout << arr[i * m + j] << ' ';
        }
        std::cout << '\n';
    }
 
    delete[] arr;
    return 0;
}
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.08.2019, 17:17

Магические циклы
Элементарнейшая задача: Найдите наибольшее произведение пяти последовательных цифр в числе. ...

магические квадраты
&quot;магический квадрат&quot; обладает тем свойством, что Все строки и Колонка суммы и две диагональные...

Магические методы
Привет, мир! Подскажите название конвенции, при которой в названии конструктора класса PHP мы...

Магические кристаллы
Всем привет, попалась вот такая задача и я не знаю что с ней делать: Есть многоугольник, заданный...

магические квадраты
Здравствуйте.Вот выдали мне тестовую работу на дом.Всё что смог решил осталось 4 задачки.Кто знает...

Магические число
1 2 3 4 5 &gt; &lt; 3 4 5 6 7 &gt; Ребята помогите с этими числами вот скрипт. Скрипт не мой но...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.