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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.02.2013, 19:12   #1
roperd
Пользователь
 
Регистрация: 14.07.2011
Сообщений: 44
Сообщение Задача

Здравствуйте, помогите пожалуйста с решением следующей задачи:
Массивом char[M][N] кодируется поле, на котором расположено несколько прямоугольников. Каждый состоит из целого числа клеток, разные прямоугольники не накладываются друг на друга и не соприкасаются. Разные прямоугольники могут состоять из разных символов. Один и тот же прямоугольник не может состоять из различных символов. Пустые квадраты поля кодируется символом '.'. Подсчитать число прямоугольников разных типов. Поле вводится с клавиатуры или читается из файла. Пример:
###...??..+.
###.=.??..+.
###.......+.
.....???....
???.......==
???...####..
Для этого поля программа должна выдать ответ:
#-прямоугольников: 2
?-прямоугольников: 3
+-прямоугольников: 1
=-прямоугольников: 2
roperd вне форума Ответить с цитированием
Старый 18.02.2013, 20:20   #2
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

При наложенных ограничениях задача совсем простая
Код:
#include <iostream>
#include <string>
#include <vector>
#include <map>

using namespace std;

int main()
{
    //инициализация
    vector<string> matrix = {
        "###...??..+.",
        "###.=.??..+.",
        "###.......+.",
        ".....???....",
        "???.......==",
        "???...####.."
    };
    //для подсчета прямоугольников
    map<char, int> counter;
    char current = '.';

    //бежим по всему массиву
    for(int y = 0; y < matrix.size(); y++)
    {
        for(int x = 0; x < matrix[y].length(); x++)
        {
            //если встетили не пустой квадрат
            if(matrix[y][x] != '.')
            {
                //если текущий символ был точкой
                if(current == '.')
                {
                    //проверяем есть ли запись об символе в map и если да, то увеличиваем счетчик
                    //в противном случае присваиваем 1
                    if( counter.find(matrix[y][x]) != counter.end() )
                        counter[matrix[y][x]]++;
                    else
                        counter[matrix[y][x]] = 1;
                    //запоминаем текущий символ
                    current = matrix[y][x];
                }
                //заполняем все что ниже точками, пока не встретим точку
                for(int j = y; j < matrix.size(); j++)
                {
                    if(matrix[j][x] != '.') matrix[j][x] = '.';
                    else break;
                }
            }
            else current = '.';
        }
    }
    //вывод результата
    for (auto iter = counter.begin(); iter != counter.end(); iter++)
        cout << iter->first << " - " << iter->second << "\n";
    return 0;
}
Kostia вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача по подсчёту статистики использования букв. Другая задача - по длинной арифметике Pascal ABC kimberly Паскаль, Turbo Pascal, PascalABC.NET 3 24.12.2012 17:03
задача на структуру(struct)/задача на работу с файлом SevenArth Помощь студентам 0 26.04.2012 19:06
Задача на оптимальный расчет маршрута (задача в презентации) в табличном процессоре Excel Toofed Помощь студентам 0 30.11.2011 01:12
Задача минимизации дисбаланса на линии сборки (задача минимакса) LenZab Microsoft Office Excel 13 13.03.2011 22:51