Step 1 (S-38595)

From Stepik Wiki
Jump to: navigation, search

Step on Stepik: https://stepik.org/lesson/13026/step/1

Step 1 (S-38595) 1.png

[00:00 - 00:17] привет сегодня мы научимся работать с таблицами это самая вообще ценное что бывает как раз людям которые не программисты а например врачи учителя или аналитики или еще кто угодно чаще всего приходится работать с таблицами


Step 1 (S-38595) 2.png

[00:17 - 00:32] и какие то данные в них впиваюсь анализировать мы начнем с простого нарисуем flac топ топ с это город вокруг его из деревни вот это все вместе называются туапсинский район у нас будет немножко стилизованный квадратный


Step 1 (S-38595) 3.png

Step 1 (S-38595) 4.png

[00:32 - 00:47] читаем размер флага который должен рисовать а как создать двумерный массив так же как в предыдущей главе с нас будет 3 часть вот обработка вывод


Step 1 (S-38595) 5.png

Step 1 (S-38595) 6.png

Step 1 (S-38595) 7.png

[00:47 - 01:05] ну вот она здесь про стоит читать 1 число значит собственно рисования флага а сначала создаем массив пусть максимальный размер 100x100 больше мы не хотим уметь работать тогда мы пишем int


[01:05 - 01:20] нас она будет стать из целых чисел название массива и квадратных скобочек максимальный размер поскольку массив в двумерном то нужно писать сначала одни квадратные скобочки а потом 2 квадратных скобочек так же как


Step 1 (S-38595) 8.png

[01:20 - 01:37] в двумерных массивов можно обращаться к отдельным элементам и работу с ним с обычными перемены при этом если вектор мы просто писали в квадратных скобочках номер элемента то в таблице мы пишем сначала номер строки о встрече квадратных скобочках номер столбца


Step 1 (S-38595) 9.png

[01:37 - 01:52] будем бегать по всему нашему массиву начиная с 0 заканчиваю n не раз там такая же с 0 все и строки и столбцы


[01:52 - 02:08] и означает номер строки жи означает номер столбца сначала прибраться строки внутри каждой строки перебираем все столбцы как рисовать нашла


[02:08 - 02:25] начнем рисования из диагоналей доконали находится элементы номер строки и столбца у которых совпадают напишем такой if если и равно же если номер в строке равен номеру столбца мы в а и жидкое вот вот элемента который мы сейчас смотрим


Step 1 (S-38595) 10.png

Step 1 (S-38595) 11.png

[02:25 - 02:42] кладем и линеечку как договорились как понять что у нас в правый верхний угол это когда номер строки меньше чем номер столбца мы имеем права тот случай когда у нас выбор из многих вариантов это else if иначе если


Step 1 (S-38595) 12.png

Step 1 (S-38595) 13.png

Step 1 (S-38595) 14.png

[02:42 - 02:57] а номер строки и меньше чем номер столбца мы кладем туда нолик и наконец else


Step 1 (S-38595) 15.png

[02:57 - 03:14] если это не правый верхний угол не диагональ кто то левый нижний угол мы будем класть на двоечку вот так наш массив номер запомнился и теперь нужно его вывести


[03:14 - 03:28] вывод там точно такой же мы бегаем по всему массиву по всем срокам для каждой строке по всем столбцам и вводим элементы я скопировал


[03:28 - 03:43] то что было сейчас закрыл скобочки придем все в порядок итак на каждом шаге нам нужно печатать очередной элемент и пробел после него так мы напечатаем целую строку


[03:43 - 03:59] но а каждая следующая строка будет отели печатать там же и у нас весь наш этот красивый номер массивчик цыкнуть в 1 длинную строку чтобы этого не было нужно после вывода все строки то есть вот мы идем по срокам


[03:59 - 04:16] вот наш цикл который выводит все элемент 1 строки после того как мы вывели все элементы 1 строке перевод строки чтобы все началось заново запустим посмотрим а например мы хотим флаг размером 15x15


Step 1 (S-38595) 16.png

[04:16 - 04:31] смотрим и вот он нас получился а теперь будем решать реально сложно задачу играли в игру сапер там где нужно открывать на поле клеточки и выделять мин правила на самом деле очень просты у нас


[04:31 - 04:47] я записана либо ничего это если бы я соседях нет мин а либо число которое означает сколько минут 8 соседних клетках либо там стоит мина наша задача такая нам дано поле на котором расставлены мины


[04:47 - 05:04] необходимо сгенерировать него поле для игры в сапера для каждой клеточке мы должны будем напечатать либо 0 если там нет соседей с милыми либо звездочку символ если там стоит мина либо число от 1 до 8 количество соседних клеточек на полных минут


Step 1 (S-38595) 17.png

[05:04 - 05:19] давайте думать как это сделать а начать с лучше удалю чтобы не запутаться что нам понадобится сочетать да пусть даны нам задают stock n и m 2 числа количество строк и колись столбцов нашем поле


Step 1 (S-38595) 18.png

[05:19 - 05:34] читаем размер поля n количество строк n количество столбцов пусть они нас не превосходит 100 то есть мы создаем массивчик 100x100


[05:34 - 05:49] и читаем перебираем строки перебираем внутри каждой строки столбец


[05:49 - 06:05] с читом очередной элемент отлично чтение готова лосьон надо написать что то чтения потому что там получится больше


[06:05 - 06:24] теперь нужно подумать о том как решать задачи мы будем ходить по всему полю и для каждой клеточке смотреть на ее соседей и считать количество соседних клеточек где стоит мина сразу подумал проблемы которые у нас возникнут самая большая проблема это клеточки в углу или находящейся на границе поля


[06:24 - 06:41] нет соседей мы вылезем за пределы массива и все будет плохо есть классный способ избавиться от этого сделать вокруг нашего поля рамочку и свободных клеток на которых мы не будем смотреть соседи но если мы посмотрим на них то видел там нолик и у нас все правильно посчитать


Step 1 (S-38595) 19.png

[06:41 - 06:55] летом мы увеличим размер нашего массива а смыслу часть то есть будем класть уже не начинайте не с 0 а начиная с единицы


Step 1 (S-38595) 20.png

[06:55 - 07:10] не забудем исправить право границы ваших циклов еще вспомним что у нас начале массивах лежит мусор она можно поставить нули то можно сделать несколькими способами можно отдельно пробежаться


Step 1 (S-38595) 21.png

[07:10 - 07:25] по вертикальному горизонталям там 4 циклами или как то объединить это а можно просто заполнить все поля нулями что мы сделаем так работать будет дольше ну вот описать меч начинать будем с 0 а ходить будем до


Step 1 (S-38595) 22.png

[07:25 - 07:40] n + 1 включительно потому что у нас теперь поле прибавила сверху 1 строку снизу 1 строку в сумме 2 и то же самое будем делать со столбцами


[07:40 - 07:55] в клеточку кладем боль вот такая инициализация массива теперь все будет правильно как обычно при по названию ну


[07:55 - 08:11] исправим нам все подчеркнула собственно заполнения поля что нам понадобится еще 1 массив такого же размера в котором собсно будет лежать наш ответ будем ходить


[08:11 - 08:29] по всем клеточкам этому уже скопируй закрой которая не скопировано отлично если соседи стоит мина то нам нужно увеличить на счетчик на единицу это бред писать либо 8 каких сложных арифметических выражений и либо 8 for в зависимости от реализации


Step 1 (S-38595) 23.png

[08:29 - 08:45] мы хотим сделать все проще если координаты нашей клеточке икс игрек это номер столбца номер строки то все соседи отличаются не больше чем единиц либо + 1 - 1 либо 0 какой то из них либо если бы y изменять


Step 1 (S-38595) 24.png

[08:45 - 09:00] что мы можем сделать мы можем завести массивы изменений по икс и игрек сейчас только в классную штуку положить на конкретных значений аш дэ икс обозначает смещение относительно нашей клеточки по икс


[09:00 - 09:15] соси 98 поэтому размер нибудь 8 я сразу иду 2 массива чтобы было удобнее смотреть делать параллельно да икс это изменения по иксу да игрек измене


[09:15 - 09:31] у нас есть сосед если он под x сдвигаемся на единицу что это такое это наши соседи справа их 3 штуки сосед справа сверху 1 - 1 сосед справа


[09:31 - 09:50] 1 0 и сосед справа снизу 1 1 2 соседа где по икс изме не происходит это те кто стоит от нас снизу и сверху соответственно для игры для них - 1 и 1 и наконец 3 левых соседа


[09:50 - 10:09] да икс у них у всех - 1 а y и 0 1 и - 1 теперь нас есть 2 для всех наших 8 соседей можно сделать классную штуку заведем переменную которая будет считать количество мил в соседях изначально равно 0 а теперь


Step 1 (S-38595) 25.png

Step 1 (S-38595) 26.png

[10:09 - 10:24] пробежимся по всем ним с помощью цикла от 0 до 8 что будем делать на каждом шаге входные данные с заданным так что у нас смена помечено единичкой


[10:24 - 10:39] поэтому можно просто посчитать сумму алиментов соседних клетках значка означает номер соседа если мы возьмем наше текущее значение икс и игрек это жи и соответственно


Step 1 (S-38595) 27.png

[10:39 - 10:55] и возьмем сдвиг то получим координат соседа ночной к накопленному количество мин прибавляем состояние поля в клеточки и + 2 игрек ката


[10:55 - 11:10] это y координаты соседа и жизнь + да икс как то это икс координат сосед номер столбца получился очень много я ужасно боюсь запутаться давайте лучше комментарий


[11:10 - 11:27] это массивы координаты соседей сдвиги а это у нас перебор всех соседей все теперь шанс


[11:27 - 11:42] наконец в нашу мерный массив ответы в таблицу мы кладем то что мы считали все осталось только вывод


[11:42 - 11:56] опять же возьмем скопировал наша форуме который бегает по осмысленно части поля


[11:56 - 12:12] вспомним 1 вещь если она стоит мина звездочку это особый случай обработан его если мина и жить равна единице то есть там стоит мина то напечатаем


[12:12 - 12:26] звездочка а иначе напечатаем то число которое мы посчитали там будет 0 если у нас нет соседи сменными и какое то количество если они есть


[12:26 - 12:43] ons и жить то будем слитно так будет выглядеть симпатичней не забудем привести строку после вывода и все настроил программу она 46 самая большая из всех которые написали


Step 1 (S-38595) 28.png

[12:43 - 12:59] запустим посмотрим что у нас получилось буду отлаживать программы нужно на маленьких данных чтобы не наливать много раз 1 и тоже пусть нас всего 1 мина в углу о какой кошмар


Step 1 (S-38595) 29.png

[12:59 - 13:16] смотреть на своего что то ужасное совершенно непонятно почему давайте смотреть в нашей программе где то ошибка искать ошибку нужно начинать с чтением только неправильно считали поставь где то после чтения


Step 1 (S-38595) 30.png

Step 1 (S-38595) 31.png

[13:16 - 13:35] а потом посмотрим что у нас лежит на поле размером 2x2 1 мина в углу добавляем то что называется контрольные значения носив мать в двумерной так показываться


Step 1 (S-38595) 32.png

Step 1 (S-38595) 33.png

[13:35 - 13:54] вот нулевая строка это то что мы проводили вот 1 строка с минами и мы видим какую то странность поле 2x2 и должно быть 4 элемента в строке и 4 строки в нас 3x3 где то мы обсчитались давайте смотреть


Step 1 (S-38595) 34.png

[13:54 - 14:10] при инициализации даже до чтения вот смотрите у нас в 1 месте до н + 1 а в другом даем очень странно исправить запустим 2x2 1 мин в углу


Step 1 (S-38595) 35.png

Step 1 (S-38595) 36.png

[14:10 - 14:24] так теперь стало хорошо вдруг вся программа заработала да отлично программу работ гир проверим на других случаях что нас все хорошо у нас


Step 1 (S-38595) 37.png

Step 1 (S-38595) 38.png

[14:24 - 14:39] 1 строка 2 столбца стоит справа нам вывела почему то всего 1 0 давайте опять же действовать по тому же алгоритму берем чтения проверяем все ли правильно читать


Step 1 (S-38595) 39.png

[14:39 - 14:56] 1 строка 2 столбца в правый край массив mines и видим там 3x3 стоишь из нулей совершенно не то что мы ожидали увидеть


Step 1 (S-38595) 40.png

Step 1 (S-38595) 41.png

Step 1 (S-38595) 42.png

[14:56 - 15:10] ну теперь понятно что делать читается неправильно понятно где искать ошибку n n вот она смотрите а я перепутал


[15:10 - 15:27] n и m то есть меня n строк здесь все правильно а м столбцов я везде написал n вместо этого и теперь поскольку я пользовался методом копипасты не придется исправлять это в куче мест и хорошо если с 1 попытки это сделать


[15:27 - 15:42] здесь не нужно поехали итак 1 строка 2 столбца справа t уже не нужен


Step 1 (S-38595) 43.png

Step 1 (S-38595) 44.png

[15:42 - 15:59] запускаю смотрим да теперь наконец то работала общими отладки программ это отлаживать ее по кусочкам так как есть сейчас дел вообще можно поступать даже не так я сейчас написал все потом вспоминал что же где я как дела исправлял в общем я сразу


Step 1 (S-38595) 45.png

[15:59 - 16:15] лучше поступать по другому написали какой то кусочек тут же запустили проверили посмотрели на от лат написали чтения посмотреть что все сочеталось правильно написали там обработку смотреть что действительно оно обработалось правильно здесь мы столкнулись с проблемой что мы много раз делали одни и те же действия


[16:15 - 16:29] если мы допустили ошибку но как я сейчас сделал то нам пришлось во многих местах исправлять это проблем можно избежать если оформлять одинаковых куске кода в виде функций собственно это мы научимся следующем занятии пока