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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.07.2015, 21:19   #1
Степанова Алина
Новичок
Джуниор
 
Регистрация: 06.07.2015
Сообщений: 3
По умолчанию

В двумерном целочисленном массиве размерностью n * m элементы приобретают только натуральных значений. Прямоугольником в массиве считать группу соседних элементов одного значения, которые вместе образуют прямоугольник размером k * l (k> 1, l> 1). прямоугольником нельзя считать группу элементов, принадлежию другому прямоугольнику. Вычислить количество прямоугольников в заданном массиве.

есть код на С++, но я никак не могу его переделать(

Код:
#include <iostream>
using namespace std;

const int n=7,m=6;
int a[n][m]={
 {1,1,1,2,2,1},
 {1,1,1,2,2,2},
 {1,1,2,2,3,7},
 {4,3,3,3,3,7},
 {5,3,3,3,3,7},
 {5,6,6,7,7,7},
 {7,6,6,7,7,7}
};

int main (void) {
    int i,j,i1,j1,start_item,end_n,end_m,count,found,by_row,bad_steps;
    for (i=0; i<n-1; i++) {
        for (j=0; j<m-1; j++) {
            if (a[i][j]==0) continue;
            start_item=a[i][j];
            end_n=i+1;
            end_m=j+1;
            found=0;
            by_row=0;
            bad_steps=0;
            while (end_n<n && end_m<m) {
                count=0;
                for (i1=i; i1<=end_n; i1++) {
                    for (j1=j; j1<=end_m; j1++) {
                        if (a[i1][j1]==start_item) count++;
                    }
                }

                if (count==(end_n-i+1)*(end_m-j+1)) {
                    found=1;
                    if (end_n<n-1) {
                        if (bad_steps<1) { end_n++; by_row=1; continue; }
                    }
                    else { bad_steps=1; }
                    if (end_m<m-1) {
                        if (bad_steps<2) { end_m++; by_row=2; continue; }
                    }
                    else { bad_steps=2; }
                }
                else {
                    if (found==0 && by_row==0) break;
                    else if (by_row==1) { end_n--; bad_steps++; }
                    else if (by_row==2) { end_m--; bad_steps++; }
                }
                if (bad_steps==2) break;
            }
            if (found) {
                cout << "(" << i << "," << j << ") - (" << end_n << "," << end_m << ")" << endl;
                for (i1=i; i1<=end_n; i1++)
                for (j1=j; j1<=end_m; j1++) a[i1][j1]=0;
            }
        }
    }
    cin.sync(); cin.get(); return 0;
}

Последний раз редактировалось Аватар; 06.07.2015 в 21:22.
Степанова Алина вне форума Ответить с цитированием
Старый 06.07.2015, 21:59   #2
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

После того, как увидел, что всё утрамбовано в main(), дальше читать не стал.
сорри, не надо так.

задачка прикольная, я б написал, если б на паскакале, ибо сишник портит мне настроение.
сын в си ваще не шарит. какая жаль.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...

Последний раз редактировалось min@y™; 06.07.2015 в 22:05.
min@y™ вне форума Ответить с цитированием
Старый 06.07.2015, 22:14   #3
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Если всё работоспособно, то просто замени
Код:
cout << "(" << i << "," << j << ") - (" << end_n << "," << end_m << ")" << endl;
на
Код:
printf("(%d, %d) - (%d, %d)\n", i,j,end_n,end_m);
Массив можеш так объявить
Код:
int a[7][6]={
 1,1,1,2,2,1,
 1,1,1,2,2,2,
 1,1,2,2,3,7,
 4,3,3,3,3,7,
 5,3,3,3,3,7,
 5,6,6,7,7,7,
 7,6,6,7,7,7
};
В начале добавить
Код:
#include <stdio.h>
#include <stdlib.h>
И в конце поправка
Код:
getchar();//cin.sync(); cin.get(); return 0;
0.jpg
eoln вне форума Ответить с цитированием
Старый 06.07.2015, 22:35   #4
Степанова Алина
Новичок
Джуниор
 
Регистрация: 06.07.2015
Сообщений: 3
По умолчанию

спасибо большое)
можете еще подсказать, как выводить не координаты, а количество прямоугольников?
Степанова Алина вне форума Ответить с цитированием
Старый 06.07.2015, 22:47   #5
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
как выводить не координаты, а количество прямоугольников?
заведи переменную int count = 0 перед циклом for.
в кострукцию if (found) {...} добавь count++;
перед cin.sync(); выводи значение на консоль cout << count;
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 06.07.2015, 22:51   #6
Степанова Алина
Новичок
Джуниор
 
Регистрация: 06.07.2015
Сообщений: 3
По умолчанию

это на Си?
Степанова Алина вне форума Ответить с цитированием
Старый 07.07.2015, 10:31   #7
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Код:
110011
011110
110011
Сколько тут прямоугольников? - может быть 5, а может быть 8?

Код:
420037
026630
520038
Все зависит от порядка, в котором они будут обрабатываться. Задача в такой постановке имхо решения не имеет.
rrrFer вне форума Ответить с цитированием
Старый 07.07.2015, 11:53   #8
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Цитата:
Сообщение от rrrFer Посмотреть сообщение
Код:
110011
011110
110011
Сколько тут прямоугольников? - может быть 5, а может быть 8?
Немного не так. Размерность массивов должна быть более чем 1х1.
Хотя массив
Цитата:
1111
1111
1111
действительно имеет либо 1, либо 2 прямоугольника

Интересно, а тут будет прямоугольник
Код:
1111
1231
1451
1111

Последний раз редактировалось eoln; 07.07.2015 в 11:55.
eoln вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Плиз помогите решить задачу.Очень срочно!! Sid-666 Общие вопросы C/C++ 0 26.05.2009 01:04
Срочно и очень важно!!! Время поджимает!!!Помогите решить задачу в Паскале на зарплату lenok113 Фриланс 7 24.05.2009 22:22