Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Задачка в С. / 16 сообщений из 16, страница 1 из 1
17.05.2016, 12:47
    #39237302
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка в С.
Запутался с задачкой.
Есть матрица n * m. Матрица заполнена нулями и единицами. Надо посчитать количество островков. Островок это две или более единичек вместе причем со всех сторон - слева,справа, вверху, внизу.
...
Рейтинг: 0 / 0
17.05.2016, 13:29
    #39237359
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка в С.
А в чём именно запутался-то?
...
Рейтинг: 0 / 0
17.05.2016, 13:56
    #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
17.05.2016, 14:11
    #39237405
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка в С.
Не-а... Попробуй реализовать вот что.
Ищем "первую" единичку. Если у неё есть хотя бы один сосед-единица, заменяем её на 2, иначе на ноль. Если соседи есть (поставлили двойку), заменяем всех её единичных соседей на двойки. Повторяем, пока хотя бы у одной двойки есть сосед-единица. Т.е. фактически "заливаем" островок двойками. Проверяем матрицу. Если есть хотя бы одна единичка, повторяем, только на сей раз заменяем на тройки. Потом на четвёрки... и так до тех пор, пока в матрице не останется единиц. Последнее подставляемое число минус 1 и будет количество островков.
...
Рейтинг: 0 / 0
17.05.2016, 14:16
    #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
17.05.2016, 14:24
    #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
17.05.2016, 14:32
    #39237431
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка в С.
jenya7в последней матрице три островаЭммм... я вижу только один:
Код: plaintext
1.
2.
3.
4.
0000
0100
0110
0010
0000
...
Рейтинг: 0 / 0
17.05.2016, 14:36
    #39237443
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка в С.
jenya7все кроме по диагонали. например в последней матрице три острова.
Это как? Нарисуй. Как Akina предложил, замени каждую единичку на номер острова к которому она относится.
...
Рейтинг: 0 / 0
17.05.2016, 14:58
    #39237472
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка в С.
Dima Tjenya7все кроме по диагонали. например в последней матрице три острова.
Это как? Нарисуй. Как Akina предложил, замени каждую единичку на номер острова к которому она относится.
ряд 2 и 3 - остров. ряд 3 - остров. ряд 3 и 4 - остров.
в этом то и проблема - найти к какому острову относиться единица.
...
Рейтинг: 0 / 0
17.05.2016, 15:03
    #39237473
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка в С.
jenya7ряд 2 и 3 - остров. ряд 3 - остров. ряд 3 и 4 - остров.
Бред какой-то...
...
Рейтинг: 0 / 0
17.05.2016, 15:17
    #39237487
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка в С.
jenya7Dima Tпропущено...

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

PS Нет тут телепатов. Ты уже не первый раз заводишь топик "помогите сделать штуку, которую не знаю как объяснить". Если ты не знаешь, то мы откуда должны знать? Давай, не ленись, формулируй четкую постановку задачи.
...
Рейтинг: 0 / 0
17.05.2016, 15:26
    #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
17.05.2016, 15:31
    #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
17.05.2016, 15:49
    #39237529
Barlone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка в С.
jenya7Островок это две или более единичек вместе причем со всех сторон - слева,справа, вверху, внизу.
c английским тоже плохо...
jenya7when island is one or more adjacent (left, right, top, bottom) ones
...
Рейтинг: 0 / 0
18.05.2016, 03:12
    #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
18.05.2016, 09:51
    #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]