Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 21.06.2016
Сообщений: 1
1

Выделение области одинаковых соседствующих элементов в матрице

21.06.2016, 19:23. Показов 1184. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день.

Помогите решить вот эту задачку. Идея есть, но воплотить никак не могу. Идея заключается в том что бы найти в матрице елемент который равен 1, после этого проверить соседние елементы слева, справа, сверху и снизу, после чего если хоть один равен 1(например слева) двигаться дальше пока он не будет равен 0 и так далее пока не проверим остальные стороны после чего выделяем это как область(заменяя эти 1чки на другую цифру, 2 например)) и так далее. Вот как то так

Заранее спасибо.

Задана прямоугольная таблица размером n * m ( 1≤n , m≤100 ) , элементами которой являются числа 0 и 1. Будем считать , что элементы со значениями 1 образуют сплошную область с соседними по горизонтали или вертикали элементами со значениями 1. Вычислить количество таких областей и площадь самой большой из них .
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.06.2016, 19:23
Ответы с готовыми решениями:

Пара соседствующих одинаковых символов
Даны символы s1, s2, … Известно, что символ s1 отличен от восклицательного знака и что среди s2,...

Выяснить, имеются ли тройки соседствующих одинаковых символов
Здравствуйте ,прошу о помощи так как не могу написать программу не используя строк и массивов(что...

Определить, есть ли в строке пара соседствующих одинаковых символов
Тема: строки. Задание: Дана строка символов. Выяснить, имеется ли в строке пара соседствующих...

Определить, имеются ли в строке два соседствующих одинаковых символа
Привет всем:) Нужно разработать программу, которая для заданной строки s определяет, имеются ли в...

1
838 / 641 / 940
Регистрация: 26.06.2015
Сообщений: 1,409
22.06.2016, 19:03 2
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#include <stdio.h>
#include <malloc.h>
#define MAX_SZ  32
#define N       7
#define M       8
 
typedef struct {
    short row, col;
} pos;
 
typedef struct _page {
    struct _page* next;
    pos   arr[MAX_SZ];
    int   cnt;
} page;
 
typedef struct {
    page* lst;
} stack_t;
 
void stack_init(stack_t* st){ st->lst = NULL; }
int  stack_empty(stack_t* st) { return (st->lst == NULL); }
int  stack_push(stack_t* st, short row, short col);
void stack_pop(stack_t* st);
void stack_clear(stack_t* st);
void stack_top(stack_t* st, short* prow, short* pcol);
 
const short g_dirs[4][2] = {{1,0},{0,1},{-1,0},{0,-1}};
 
int main(void){
    stack_t st;
    short row, col, r1, c1, i, j, d, s, k, m;
    short mat[N][M] = {
        {1,1,0,0,1,1,1,1},
        {1,1,0,0,0,0,0,0},
        {0,0,0,0,0,1,0,0},
        {0,0,0,0,1,1,1,0},
        {1,1,0,1,1,1,1,1},
        {1,1,0,0,0,0,0,0},
        {1,1,1,0,0,0,1,1},
    };
 
    m = s = 0;
    for(i = 0; i < N; ++i){
        for(j = 0; j < M; ++j){
            if(mat[i][j] != 1)
                continue;
 
            mat[i][j] += 1;
            k = 0;
 
            stack_init(&st);
            stack_push(&st, i, j);
 
            while(! stack_empty(&st)){
                stack_top(&st, &row, &col);
                stack_pop(&st);
                ++k;
 
                for(d = 0; d < 4; ++d){
                    r1 = row + g_dirs[d][0];
                    c1 = col + g_dirs[d][1];
                    if((r1 < 0) || (c1 < 0) || (r1 >= N) || (c1 >= M) || (mat[r1][c1] != 1))
                        continue;
 
                    stack_push(&st, r1, c1);
                    mat[r1][c1] += 1;
                }
            }
 
            ++m;
            if(k > s)
                s = k;
        }
    }
 
    printf("count area: %d\n", m);
    printf("maximum  S: %d\n", s);
 
    //вывести результирующею матрицу
    for(i = 0; i < N; ++i){
        for(j = 0; j < M; ++j)
            printf("%d ", mat[i][j]);
        putchar('\n');
    }
    return 0;
}
 
//вставка
int stack_push(stack_t* st, short row, short col){
    page* p = st->lst;
    if(p != NULL){
        if((p->cnt + 1) < MAX_SZ){
            p->arr[p->cnt].row = row;
            p->arr[p->cnt].col = col;
            ++(p->cnt);
            return 1;
        }
    }
 
    p = (page*)malloc(sizeof(page));
    if(p == NULL)
        return 0;
    
    p->arr[0].row = row;
    p->arr[0].col = col;
    p->cnt  = 1;
    p->next = st->lst;
    st->lst = p;
    return 1;
}
 
//удаление
void stack_pop(stack_t* st){
    page* p = st->lst;
    if(p != NULL){
        if(p->cnt > 0)
            --(p->cnt);
 
        if(p->cnt == 0){
            st->lst = st->lst->next;
            free(p);
        }
    }
}
 
//удаление всех
void stack_clear(stack_t* st){
    while(! stack_empty(st))
        stack_pop(st);
}
 
//получение текущих данных
void stack_top(stack_t* st, short* prow, short* pcol){
    page* p = st->lst;
    if((p != NULL) && (p->cnt > 0)){
        *prow = p->arr[p->cnt - 1].row;
        *pcol = p->arr[p->cnt - 1].col;
    }
}
0
22.06.2016, 19:03
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.06.2016, 19:03
Помогаю со студенческими работами здесь

Выяснить, имеется ли среди s1,...,sn пара соседствующих одинаковых символов
Даны символы s1, s2,... Известно, что символ s1 отличен от восклицательного знака и что среди s2,...

Выяснить, имеется' ли среди s1,…,sn пара соседствующих одинаковых символов
Выяснить, имеется' ли среди s1,…,sn пара соседствующих одинаковых символов.

Определить, имеются ли в строке два соседствующих одинаковых символа
определить,имеются ли в строке два соседствующих одинаковых символа

Проверить, имеются ли в строке два соседствующих одинаковых символа
Выясните, имеются ли в строке S два соседствующих одинаковых символа.


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru