Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/15: Рейтинг темы: голосов - 15, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 23.11.2014
Сообщений: 17

Перекраска клеток

06.08.2015, 11:24. Показов 3147. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Дано клетчатое поле N x M, все клетки поля изначально белые. Автомат умеет:

закрасить клетку (i,j) в черный цвет.
для клетки (i,j) узнать её ближайших белых соседей по вертикали и горизонтали.

Дана последовательность команд для автомата. Требуется выполнить эти команды в указанной последовательности, и для каждой команды запроса ближайших белых соседей указать результат ее выполнения.
Входные данные

Сначала вводятся размеры поля N и M (1 ≤ N ≤ 20, 1 ≤ M ≤ 50000), затем количество команд K (1 ≤ K ≤ 105), а затем сами команды. Команды записаны по одной в строке в следующем формате:

Colori j — окраска клетки (i,j) в черный цвет;
Neighbors i j — нахождение белых соседей для БЕЛОЙ клетки (i,j).

1 ≤ i ≤ N, 1 ≤ j ≤ M.
Выходные данные

На каждый запрос Neighbors требуется вывести сначала количество ближайших белых соседей (или 0, если ни с одной из сторон белых клеток не осталось), а затем их координаты (соседей можно перечислять в произвольном порядке). Если запросов Neighbors нет, ничего выводить не надо.
Источник, откуда я взял задачу:
http://informatics.mccme.ru/mo... =37r8983#1
При отправке данного кода, проходит всего один тест, хотя я проверял на других примерах - всё вроде бы правильно. Помогите, пожалуйста, найти ошибки. Заранее спасибо!
Вот код:
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include <iostream>
#include <string>
using namespace std;
 
struct point
{
    int x,y;
    string s;
};
 
int main()
{
    int n,m,k,a[20][5000],kil=0,kl=0;
    point b[100000];
    string s;
    cin >> n >> m >> k;
    for (int i=1; i<=k; i++)
    {
        cin >> b[i].s >> b[i].x >> b[i].y;
        if (b[i].s=="Neighbors") kil++;
    }
    for (int i=0; i<=n; i++)
    for (int j=0; j<=m; j++)
    {
        a[i][j]=0;
    }
    if (kil!=0)
    {
        cout << kil << endl;
        for (int l=1; l<=k; l++)
        {
            if (b[l].s=="Color") a[b[l].x][b[l].y]=1;
            else
            if (b[l].s=="Neighbors")
            {
                int t=1;
                while (b[l].y-t!=0)   //поиск клеток слева от заданной по горизонтали
                {
                if (a[b[l].x][b[l].y-t]==1) t++;
                else if (a[b[l].x][b[l].y-t]==0) {kl++; a[b[l].x][b[l].y-t]=5; break; }
                }
                t=1;
                while (b[l].y+t!=m+1)    //поиск клеток справа от заданной по горизонтали
                {
                if (a[b[l].x][b[l].y+t]==1) t++;
                else if (a[b[l].x][b[l].y+t]==0) {kl++; a[b[l].x][b[l].y+t]=5; break;}
                }
                t=1;
                while (b[l].x-t!=0)    //поиск клеток сверху от заданной по вертикали
                {
                if (a[b[l].x-t][b[l].y]==1) t++;
                else if (a[b[l].x-t][b[l].y]==0) {kl++; a[b[l].x-t][b[l].y]=5; break;}
                }
                t=1;
                while (b[l].x+t!=n+1)     //поиск клеток снизу от заданной по вертикали
                {
                if (a[b[l].x+t][b[l].y]==1) t++;
                else if (a[b[l].x+t][b[l].y]==0) {kl++; a[b[l].x+t][b[l].y]=5; break;}
                }
                cout << kl << endl;
                kl=0;
                for (int i=0; i<=n; i++)
                    for (int j=0; j<=m; j++)
                        if (a[i][j]==5) {cout << i << " " << j; cout << endl; a[i][j]=0;}
            }
        }
    }
    return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.08.2015, 11:24
Ответы с готовыми решениями:

Игра в закрашивание клеток
Двое ребят на клетчатом листе бумаги N × M клеток играют в такую игру: они по очереди закрашивают клетки (изначально все клетки не...

Пересечение клеток на плоскости отрезком
Салют всем тем, кому еще не салютовал :} Есть программа, реализующая подсчет клеток с целочисленными вершинами, которые пересекаются...

Движение игроков по полю 9 на 9 клеток
Два игрока стартуют в левом верхнем углу поля 9*9 и движутся к центру поля. Победит тот, кто придет первым. Положение первого игрока можно...

11
 Аватар для Praktolock
73 / 73 / 18
Регистрация: 29.11.2011
Сообщений: 356
06.08.2015, 16:23
Цитата Сообщение от Петров Посмотреть сообщение
b[i].s=="Neighbors"
так никто равенство строк не проверяет

Добавлено через 2 минуты
вместо
Цитата Сообщение от Петров Посмотреть сообщение
if (b[i].s=="Neighbors")
нужно:
C++
1
if(!strcmp(b[i].s, "Neighbors"))
0
0 / 0 / 0
Регистрация: 23.11.2014
Сообщений: 17
06.08.2015, 16:53  [ТС]
И так надо сделать для остальных строк?
0
 Аватар для Praktolock
73 / 73 / 18
Регистрация: 29.11.2011
Сообщений: 356
06.08.2015, 16:55
Конечно. Ну это первое что бросилось в глаза, а вообще по коду очень сложно разбираться, вы давали бы понятные имена переменным. Чтобы понять что такое a, что такое b что такое kil, kl и прочее нужно неслабо напрячься. Трудночитабельный код
0
0 / 0 / 0
Регистрация: 23.11.2014
Сообщений: 17
06.08.2015, 17:06  [ТС]
а - это двумерный массив клеток, b - массив типа point(point-структура),kil - количество команд Neighbors(которые выводить не нужно, а я выводил), kl - количество ближайших соседей для клетки с командой Neighbors. Убрал вывод команд(kil). Уже лучше - прошло 13 тестов. Но для остальных пишет ошибка выполнения. Можете подсказать, пожалуйста, как сделать двумерный массив a[20][50000]?
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
06.08.2015, 17:43
Цитата Сообщение от Praktolock Посмотреть сообщение
так никто равенство строк не проверяет
Это секретная техника class string, известная только адептам истинных плюсов.
Но на курсах "гадом буду, это не Си, а Си плюс плюс" ей действительно не учат.
0
0 / 0 / 0
Регистрация: 23.11.2014
Сообщений: 17
06.08.2015, 17:49  [ТС]
Можете ,пожалуйста, объяснить, как по условию задачи сделать двумерный массив a[20][50000]. Когда я пишу просто в таком виде, компилятор выбивает ошибку.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
06.08.2015, 17:56
Цитата Сообщение от Петров Посмотреть сообщение
Можете ,пожалуйста, объяснить, как по условию задачи сделать двумерный массив a[20][50000]. Когда я пишу просто в таком виде, компилятор выбивает ошибку.
C++
1
auto a=new int[20][50000];
0
0 / 0 / 0
Регистрация: 23.11.2014
Сообщений: 17
06.08.2015, 20:51  [ТС]
Пишет: error: 'a' does not name a type
0
 Аватар для Praktolock
73 / 73 / 18
Регистрация: 29.11.2011
Сообщений: 356
07.08.2015, 03:47
Цитата Сообщение от Петров Посмотреть сообщение
Пишет: error: 'a' does not name a type
Твой компилятор не поддерживает новый стандарт
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
07.08.2015, 05:53
Цитата Сообщение от Петров Посмотреть сообщение
Пишет: error: 'a' does not name a type
Тогда int(*a)[50000]=new int[20][50000]
1
0 / 0 / 0
Регистрация: 23.11.2014
Сообщений: 17
07.08.2015, 08:39  [ТС]
Спасибо. Правда в некоторых тестах пишет: превышено максимальное время работы. Можна как-нибудь оптимизировать программу?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.08.2015, 08:39
Помогаю со студенческими работами здесь

Нумерация клеток заданной полоски
Помогите пожалуйста с заданием! Дана полоска длиной 2k клеток и шириной в одну клетку. Полоску несколько раз сгибают пополам так, чтобы...

Цвет клеток на шахматной доске
Даны координаты двух различных полей шахматной доски x1, y1, x2, y2 (целые числа, лежащие в диапазоне 1–8). Проверить истинность...

Координаты двух клеток шахматной доски
Есть координаты двух клеток шахматной доски. Вывести Yes, если фигура может за один ход перейти с одной клетки в другую. В другом случае...

Определить сколько клеток по периметру доски
Задача с условным оператором. В каждую крайнюю клетку квадратной доски поставили по фишке. Могло ли оказаться, что выставлено ровно k...

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


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача №1: при указании работ (справочник РаботыПоРемонтуСпецтехники),. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru