Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.08.2012, 19:55   #1
PG94
Новичок
Джуниор
 
Регистрация: 23.08.2012
Сообщений: 2
Вопрос Задача с Codeforce

Вот условие(Задача 203B):
Цитата:
В один не самый прекрасный вечер Валере было очень скучно. Чтобы немного себя развлечь, Валера нашел следующее занятие.Он взял белый квадратный клетчатый лист бумаги, состоящий из n × n клеток. После этого он стал закрашивать белые клетки листа одну за другой в черный цвет. Всего он закрасил m различных клеток этого листа. Поскольку у Валеры была какая-то предрасположенность ко всему квадратному, его заинтересовал следующий вопрос — после какого хода впервые на листке можно найти черный квадрат со стороной 3. Однако Валера не знает ответ на этот вопрос и поэтому просит Вашей помощи.
От Вас требуется найти минимальный номер хода, после которого на клетчатом листке образовался хотя бы один квадрат черного цвета со стороной 3 или определить, что такого хода нет.
Входные данные
В первой строке задано два целых числа n и m (1 ≤ n ≤ 1000, 1 ≤ m ≤ min(n·n, 10^5)) — размер клетчатого листа и количество ходов соответственно.
Далее в m строках задано описание ходов. В i-ой строке находятся два числа xi, yi (1 ≤ xi, yi ≤ n) — номер строки и номер столбца, в котором находится клетка, закрашиваемая на i-ом ходе.
Все числа в строках разделены единичными пробелами. Гарантируется, что все ходы различны. Ходы нумеруются, начиная с 1, в том порядке, в котором они заданы во входных данных. Столбцы клетчатого листа бумаги нумеруются, начиная с 1, слева направо. Строки клетчатого листа бумаги нумеруются, начиная с 1, сверху вниз.
Выходные данные
В единственной строке выведите ответ на задачу — минимальный номер хода, после которого на листе образуется черный квадрат со стороной 3. Если такого хода не существует, выведите -1.
И вот верное решение:
Код:
#include<iostream>
#include<conio.h>
using namespace std;
int n,m,x,y,a[1005][1005]={0},i,l,r;
int main()
{   cin>>n>>m;
    for(i=1;i<=m;i++)
    {   cin>>x>>y;
        for(l=x;l<x+3;l++)
        {   for(r=y;r<y+3;r++)
            {   a[l][r]++;
                if(a[l][r]==9)
                {   cout<<i;
                    getch();
                    return 0;
                }
            }
        }
    }
cout<<-1;
getch();
return 0;
}
Самому задачу решить не получилось, но и логика данного кода мне не очень понятна(т.е. почему такие действия дают верный ответ). Буду очень благодарен, если кто-нибудь пояснит приведённое решение, т.е. объяснить логику данного алгоритма. Само же решение мне пока представляется как подбор правильной абстрактной(важно конкретизировать и обосновать) закономерности, дающей верный ответ.
PG94 вне форума Ответить с цитированием
Старый 23.08.2012, 21:14   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Попробую на простом примере пояснить. Пусть у вас есть тонкие пленочки 3 на 3 см. Каждая координата - это квадратик 1 на 1 см. Кладем пленочку по координатам (1;1) (левый верхний угол пленочки на этой координате). Теперь координаты (1;1)..(3;3) покрыты 1 слоем пленки. Если мы продолжим класть пленочки по этим координатам ((1;2)..(3;3)), то получим наложения пленок друг на друга. В точке с координатами (3;3) получится наложение 9 пленок (попробуйте с бумажками). Т.е., если есть точка, в которой пленки в 9 слоев, то значит, пленки лежат в соседних клетках так, что координаты их наложения образуют квадрат со стороной 3 на 3.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 23.08.2012, 21:26   #3
PG94
Новичок
Джуниор
 
Регистрация: 23.08.2012
Сообщений: 2
По умолчанию

Спасибо. Однако сам процесс я понял, не ясен ход мыслей при решении, или какого типа, если можно так сказать, явл. алгоритм:
- Превращение действий исполнителя в код( напр. алгоритм заполнения матрицы по спирали, где можно представить сам процесс движения по матрице, а затем описать его с помощью кода)
- Исп. удобной закономерности (как я понимаю наложения "плёночек" относится именно к этому типу, т.е. одного представления действий не хватит)
P.S. Хочу понять, как нужно мыслить при решении тех или иных задач.
PG94 вне форума Ответить с цитированием
Старый 23.08.2012, 23:31   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

"Нельзя так просто взять и написать красивое решение"
Цитата:
P.S. Хочу понять, как нужно мыслить при решении тех или иных задач.
Имхо, нельзя вот так взять и для любой задачи придумать красивый алгоритм. Такой код может быть или озарением, или откуда-нибудь почерпнутым. Нужно читать разборы олимпиад, чтобы набираться алгоритмами. Мое мнение - нужно быть гением, чтобы к любой задаче находить нестандартное решение. +1 задача в вашей копилке алгоритмов решения.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
задача на структуру(struct)/задача на работу с файлом SevenArth Помощь студентам 0 26.04.2012 19:06
Задача о станках Задача Джонсона Aiga Помощь студентам 4 05.02.2012 21:48
Задача на оптимальный расчет маршрута (задача в презентации) в табличном процессоре Excel Toofed Помощь студентам 0 30.11.2011 01:12
Задача минимизации дисбаланса на линии сборки (задача минимакса) LenZab Microsoft Office Excel 13 13.03.2011 22:51