powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Задачка в С.
16 сообщений из 16, страница 1 из 1
Задачка в С.
    #39237302
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Запутался с задачкой.
Есть матрица n * m. Матрица заполнена нулями и единицами. Надо посчитать количество островков. Островок это две или более единичек вместе причем со всех сторон - слева,справа, вверху, внизу.
...
Рейтинг: 0 / 0
Задачка в С.
    #39237359
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А в чём именно запутался-то?
...
Рейтинг: 0 / 0
Задачка в С.
    #39237395
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinaА в чём именно запутался-то?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
int countIslands(int A[][COL], int m, int n)
 {  
     int count = 0; 
     for(int i=0; i<m; i++) 
     {  
          for(int j=0; j<n; j++) 
         {     
             if(A[i][j] == 1) 


и тут я застрял. :)
...
Рейтинг: 0 / 0
Задачка в С.
    #39237405
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не-а... Попробуй реализовать вот что.
Ищем "первую" единичку. Если у неё есть хотя бы один сосед-единица, заменяем её на 2, иначе на ноль. Если соседи есть (поставлили двойку), заменяем всех её единичных соседей на двойки. Повторяем, пока хотя бы у одной двойки есть сосед-единица. Т.е. фактически "заливаем" островок двойками. Проверяем матрицу. Если есть хотя бы одна единичка, повторяем, только на сей раз заменяем на тройки. Потом на четвёрки... и так до тех пор, пока в матрице не останется единиц. Последнее подставляемое число минус 1 и будет количество островков.
...
Рейтинг: 0 / 0
Задачка в С.
    #39237411
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты бы примеры показал что считать островками.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
0000
0100
0010
0010
0000

0000
0100
0110
0000

0000
0100
0110
0010
0000
Тут сколько островков в каждом примере?
...
Рейтинг: 0 / 0
Задачка в С.
    #39237424
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TТы бы примеры показал что считать островками.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
0000
0100
0010
0010
0000

0000
0100
0110
0000

0000
0100
0110
0010
0000
Тут сколько островков в каждом примере?
все кроме по диагонали. например в последней матрице три острова.
...
Рейтинг: 0 / 0
Задачка в С.
    #39237431
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7в последней матрице три островаЭммм... я вижу только один:
Код: plaintext
1.
2.
3.
4.
0000
0100
0110
0010
0000
...
Рейтинг: 0 / 0
Задачка в С.
    #39237443
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7все кроме по диагонали. например в последней матрице три острова.
Это как? Нарисуй. Как Akina предложил, замени каждую единичку на номер острова к которому она относится.
...
Рейтинг: 0 / 0
Задачка в С.
    #39237472
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima Tjenya7все кроме по диагонали. например в последней матрице три острова.
Это как? Нарисуй. Как Akina предложил, замени каждую единичку на номер острова к которому она относится.
ряд 2 и 3 - остров. ряд 3 - остров. ряд 3 и 4 - остров.
в этом то и проблема - найти к какому острову относиться единица.
...
Рейтинг: 0 / 0
Задачка в С.
    #39237473
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7ряд 2 и 3 - остров. ряд 3 - остров. ряд 3 и 4 - остров.
Бред какой-то...
...
Рейтинг: 0 / 0
Задачка в С.
    #39237487
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7Dima Tпропущено...

Это как? Нарисуй. Как Akina предложил, замени каждую единичку на номер острова к которому она относится.
ряд 2 и 3 - остров. ряд 3 - остров. ряд 3 и 4 - остров.
в этом то и проблема - найти к какому острову относиться единица.
Давай четкое определение что такое "остров". Какие острова бывают. Какой формы. В каких случаях одна и та же единица может принадлежать двум островам.

PS Нет тут телепатов. Ты уже не первый раз заводишь топик "помогите сделать штуку, которую не знаю как объяснить". Если ты не знаешь, то мы откуда должны знать? Давай, не ленись, формулируй четкую постановку задачи.
...
Рейтинг: 0 / 0
Задачка в С.
    #39237494
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima Tjenya7пропущено...

ряд 2 и 3 - остров. ряд 3 - остров. ряд 3 и 4 - остров.
в этом то и проблема - найти к какому острову относиться единица.
Давай четкое определение что такое "остров". Какие острова бывают. Какой формы. В каких случаях одна и та же единица может принадлежать двум островам.

PS Нет тут телепатов. Ты уже не первый раз заводишь топик "помогите сделать штуку, которую не знаю как объяснить". Если ты не знаешь, то мы откуда должны знать? Давай, не ленись, формулируй четкую постановку задачи.
задачка дана на английском. я ее понял так как описал. а вот оригинал.
Given a map m*n of 0 and 1, implement a function of counting islands of 1’s, when island is one or more adjacent (left, right, top, bottom) ones. Diagonal ones are not considered adjacent.
...
Рейтинг: 0 / 0
Задачка в С.
    #39237503
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7задачка дана на английском. я ее понял так как описал. а вот оригинал.
Given a map m*n of 0 and 1, implement a function of counting islands of 1’s, when island is one or more adjacent (left, right, top, bottom) ones. Diagonal ones are not considered adjacent.
Тогда остров один, как Akina нарисовал 19183970 . Как решать он уже написал 19183812
...
Рейтинг: 0 / 0
Задачка в С.
    #39237529
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7Островок это две или более единичек вместе причем со всех сторон - слева,справа, вверху, внизу.
c английским тоже плохо...
jenya7when island is one or more adjacent (left, right, top, bottom) ones
...
Рейтинг: 0 / 0
Задачка в С.
    #39237821
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7Given a map m*n of 0 and 1, implement a function of counting islands of 1’s, when island is one or more adjacent (left, right, top, bottom) ones. Diagonal ones are not considered adjacent.Можно просто занулять острова, пока их не останется:
Код: plaintext
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.
#include <stddef.h>
#include <assert.h>
#include <stdbool.h>

int* _map = NULL;
int _width, _height;

int* cell_at(int row, int col);
bool find_one(int* row, int* col);
void zero_cells(int row, int col);

/* меняет содержимое массива */
int count_islands(int map[], int width, int height) {
  int islands_count;
  int row, col;

  /* проверяем входные данные */
  assert(width >= 1);
  assert(height >= 1);

  /* для простоты, сохраняем контекст в глобальные переменные */
  _map = map;
  _width = width;
  _height = height;

  islands_count = 0;
  while (find_one(&row, &col)) {
    islands_count++;
    /* зануляем остров */
    zero_cells(row, col);
  }

  _map = NULL;

  return islands_count;
}

/* индексация двумерного массива */
int* cell_at(int row, int col) {
  assert(_map != NULL);
  assert((0 <= row) && (row < _height));
  assert((0 <= col) && (col < _width));
  /* двумерный массив реализован как одномерный массив длины height * width */
  return &_map[row * _width + col];
}

bool find_one(int* row, int* col) {
  int r, c;

  for (r = 0; r < _height; r++) {
    for (c = 0; c < _width; c++) {
      if (*cell_at(r, c) == 1) {
        *row = r;
        *col = c;
        return true;
      }
    }
  }

  return false;
}

void zero_cells(int row, int col) {
  assert(*cell_at(row, col) == 1);
  *cell_at(row, col) = 0;

  /* зануляем единичных соседей */
  if ((col - 1 >= 0) && (*cell_at(row, col - 1) == 1)) {
    zero_cells(row, col - 1);
  }
  if ((col + 1 < _width) && (*cell_at(row, col + 1) == 1)) {
    zero_cells(row, col + 1);
  }
  if ((row - 1 >= 0) && (*cell_at(row - 1, col) == 1)) {
    zero_cells(row - 1, col);
  }
  if ((row + 1 < _height) && (*cell_at(row + 1, col) == 1)) {
    zero_cells(row + 1, col);
  }
}

int main() {
  int map[] = {
    1,0,0,0,0,0,0,0,0,0,0,
    0,0,0,1,1,1,1,1,0,1,0,
    0,0,1,1,0,0,0,1,0,1,1,
    0,0,1,1,0,1,0,1,1,0,0,
    1,0,0,1,0,0,0,1,1,0,0,
    1,1,0,1,1,1,1,1,1,0,0,
  };
  assert(count_islands(map, /*width:*/11, /*height:*/6) == 5);
  return 0;
}

Здесь используется обход в глубину (функция zero_cells), но есть и более эффективный алгоритм «затопления» острова, он так и называется, flood fill.
...
Рейтинг: 0 / 0
Задачка в С.
    #39237941
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пётр Седовjenya7Given a map m*n of 0 and 1, implement a function of counting islands of 1’s, when island is one or more adjacent (left, right, top, bottom) ones. Diagonal ones are not considered adjacent.Можно просто занулять острова, пока их не останется:
Код: plaintext
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.
#include <stddef.h>
#include <assert.h>
#include <stdbool.h>

int* _map = NULL;
int _width, _height;

int* cell_at(int row, int col);
bool find_one(int* row, int* col);
void zero_cells(int row, int col);

/* меняет содержимое массива */
int count_islands(int map[], int width, int height) {
  int islands_count;
  int row, col;

  /* проверяем входные данные */
  assert(width >= 1);
  assert(height >= 1);

  /* для простоты, сохраняем контекст в глобальные переменные */
  _map = map;
  _width = width;
  _height = height;

  islands_count = 0;
  while (find_one(&row, &col)) {
    islands_count++;
    /* зануляем остров */
    zero_cells(row, col);
  }

  _map = NULL;

  return islands_count;
}

/* индексация двумерного массива */
int* cell_at(int row, int col) {
  assert(_map != NULL);
  assert((0 <= row) && (row < _height));
  assert((0 <= col) && (col < _width));
  /* двумерный массив реализован как одномерный массив длины height * width */
  return &_map[row * _width + col];
}

bool find_one(int* row, int* col) {
  int r, c;

  for (r = 0; r < _height; r++) {
    for (c = 0; c < _width; c++) {
      if (*cell_at(r, c) == 1) {
        *row = r;
        *col = c;
        return true;
      }
    }
  }

  return false;
}

void zero_cells(int row, int col) {
  assert(*cell_at(row, col) == 1);
  *cell_at(row, col) = 0;

  /* зануляем единичных соседей */
  if ((col - 1 >= 0) && (*cell_at(row, col - 1) == 1)) {
    zero_cells(row, col - 1);
  }
  if ((col + 1 < _width) && (*cell_at(row, col + 1) == 1)) {
    zero_cells(row, col + 1);
  }
  if ((row - 1 >= 0) && (*cell_at(row - 1, col) == 1)) {
    zero_cells(row - 1, col);
  }
  if ((row + 1 < _height) && (*cell_at(row + 1, col) == 1)) {
    zero_cells(row + 1, col);
  }
}

int main() {
  int map[] = {
    1,0,0,0,0,0,0,0,0,0,0,
    0,0,0,1,1,1,1,1,0,1,0,
    0,0,1,1,0,0,0,1,0,1,1,
    0,0,1,1,0,1,0,1,1,0,0,
    1,0,0,1,0,0,0,1,1,0,0,
    1,1,0,1,1,1,1,1,1,0,0,
  };
  assert(count_islands(map, /*width:*/11, /*height:*/6) == 5);
  return 0;
}

Здесь используется обход в глубину (функция zero_cells), но есть и более эффективный алгоритм «затопления» острова, он так и называется, flood fill.
спасибо. интересное решение.
я сделал по другому. там не обрабатываются все случаи.
Код: 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.
#define ROWS 10
#define COLS 10

void Check(uint8_t matr[ROWS][COLS],uint32_t row,uint32_t col, uint8_t check[ROWS][COLS])
{
    //check the right side
	if ((col+1) < COLS)
	  if (matr[row][col+1])
		  check[row][col+1] = 1;
	//check the bottom side
	if ((row+1) < ROWS)
		if (matr[row+1][col])
			check[row+1][col] = 1;
}

//typedef struct Point
uint32_t FindIslands(uint8_t matrix[ROWS][COLS], uint32_t rows, uint32_t cols)
{
	uint8_t checked[ROWS][COLS];
	memset(checked, 0, sizeof(checked));

	uint32_t count = 0;
	uint32_t i,j;

	for (i=0; i < ROWS; i++)  
	{
		for (j=0; j < COLS; j++)  
		{
		       //if a cell with value 1 is not visited yet, then new island found
                       if (matrix[i][j] && !checked[i][j])
                      {
        	          //check all cells in this island
        	          Check(matrix, i, j, checked);
        	          ++count;
                      }
		}
	}
	return count;
}


но у вас решение более полное.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Задачка в С.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]