Счастливые случаи
Счастливый случай — это лотерея. Каждый лотерейный билет имеет игровое поле и закрытую область. Игровое поле представляет собой прямоугольник размера $r \times c$, заполненный числами. Закрытая область скрывает номер строки и колонки, на пересечении которых находится игровая ячейка.
Существует четыре возможных выигрышных направления: вверх, вниз, влево и вправо. Направление считается выигрышным, если все числа в этом направлении от игровой ячейки в точности меньше числа в самой игровой ячейке. Если игровая ячейка находится на краю таблицы, то Вы автоматически имеете выигрышное направление!
Входные данные
В первой строке находятся два целых числа $r$ и $c$ $(1 \leqslant r, c \leqslant 100)$ — количество строк и колонок в таблице.
Каждая из следующих $r$ строк содержит $c$ чисел — значения на игровом поле. Каждое число положительно и не превосходит 1000.
Выходные данные
Вывести одно число $w$ — общее количество выигрышных направлений для заданной таблицы.
Тесты
# | ВХОДНЫЕ ДАННЫЕ | ВЫХОДНЫЕ ДАННЫЕ |
---|---|---|
1 | $1$ $1$ $4$ |
$4$ |
2 | $2$ $4$ $0$ $0$ $0$ $0$ $0$ $0$ $0$ $0$ |
$12$ |
3 | $3$ $2$ $10$ $10$ $10$ $10$ $4$ $5$ |
$13$ |
4 | $2$ $2$ $1$ $2$ $3$ $4$ |
$12$ |
5 | $0$ $0$ | $0$ |
Код программы
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 |
#include <iostream> using namespace std; int main() { int r, c, a, b, e, d, w = 0; cin >> r >> c; int **x = new int * [r]; for (int i = 0; i < r; i++) x[i] = new int[c]; for (int i = 0; i < r; i++){ for (int j = 0; j > x[i][j]; } } for (int i = 0; i < r; i++){ for (int j = 0; j < c; j++){ a = b = e = d = 1; for (int q = 0; q < i; q++){ if (x[i][j] <= x[q][j]) a = 0; } for (int q = i+1; q < r; q++){ if (x[i][j] <= x[q][j]) b = 0; } for (int k = 0; k < j; k++){ if (x[i][j] <= x[i][k]) e = 0; } for (int k = j+1; k < c; k++){ if (x[i][j] <= x[i][k]) d = 0; } w+= a + b + e + d; } } cout << w; return 0; } |
Решение задачи
Решение данной задачи состоит в том, чтобы создать цикл, который будет сравнивать все элементы массива. Изначально у нас будут четыре переменных, которые отвечают за каждую из сторон массива, равные единице. Далее мы сравниваем каждый элемент строки с последующими в нужном направлении и если он не является выигрышным, то соответствующей переменной задаем значение ноль. Просуммировав все «выигрышные случаи» мы узнаем количество выигрышных направлений.
Ссылки
• Задача на e-olymp.
• Решение на сайте ideone.