Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
serik13
3 / 3 / 0
Регистрация: 04.01.2011
Сообщений: 71
#1

на С++ Черно-белая графика - C++

16.09.2011, 09:47. Просмотров 1102. Ответов 1
Метки нет (Все метки)

Нужно решить на С++

Каждый элемент квадратной матрицы размеренности N x N равен нулю, либо единице. Найдите количество «островов», образованных единицами. Под «островом» понимается группа единиц (либо одна единица), со всех сторон окруженная нулями (или краями матрицы). Единицы относятся к одному «острову», если из одной из них можно перейти к другой «наступая» на единицы, расположенные в соседних клетках. Соседними являются клетки, граничащие по горизонтали или вертикали.

Входные данные

В первой строке файла INPUT.TXT записано натуральное число N не больше 100 - размер квадратной матрицы. В следующих N строках задаются элементы матрицы через пробел.

Выходные данные

В файл OUTPUT.TXT выведите единственное число - количество островов


Есть решение на Паскале
Pascal
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
const
  m = 102;
var
  a:array [1..m, 1..m] of integer;
  i,j,n,res: integer;
  input,output: text;
procedure count(i,j: integer);
  begin
    if a[i,j] <> 1 then
      exit;
    a[i,j] := 0;
    count(i + 1, j);
    count(i - 1, j);
    count(i, j + 1);
    count(i, j - 1);
  end;
begin
  res:= 0;
  assign(input,'input.txt');
  reset(input);
  assign(output,'output.txt');
  rewrite(output);
  read(input, n);
  {Заполняем массив нулями}
  for i:= 1 to n+2 do
    for j:=1 to n+2 do
      a[i,j]:=0;
  {Считываем матрицу из файла}
  for i:= 2 to n+1 do
    for j:=2 to n+1 do
      read(input,a[i,j]);
  {Обходим матрицу в поиске островов}
  for i := 2 to n+1 do
    for j := 2 to n+1 do
      if a[i,j] = 1 then
        begin
          inc(res);
          count(i,j);
        end;
  write(output,res);
  close(input);
  close(output);
end.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.09.2011, 09:47
Здравствуйте! Я подобрал для вас темы с ответами на вопрос на С++ Черно-белая графика (C++):

Черно-белая графика (Задача) - C++
Одна из базовых задач компьютерной графики – обработка черно-белых изображений. Изображения можно представить в виде прямоугольников...

Задача на с++ Черно-белая графика - C++
Нужно решить на с++ заранее спасибоо! Одна из базовых задач компьютерной графики – обработка черно-белых изображений. Изображения...

Цветной BMP в черно-белый - C++
Всем привет! Я выделяю из изображения один цветовой канал и нужно сохранить его в черно-белом виде в BMP файле. Первой мыслью было...

Черно-белое изображение в одномерный массив - C++
Подскажите как преобразовать изображение 256х256х8. В одномерный массив?

Загрузить черно-белое изображение в массив - C++
Здравствуйте, помогите с решением задачи: как загрузить бинарное изображение(черное и белое только) в массив? Спасибо.

Как сделать черно белый скрин в WinXP - C++
В Windows 7 задаю количетсво цветов к примеру черно былый и скрин делаеться нормально А в Windows XP просто ничего не происходит, скрин...

1
xAtom
915 / 740 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
16.09.2011, 16:50 #2
serik13, вот вариант набросал, если что писал в торопях.
Формат входящего файла:
10
1 1 1 0 0 1 1 1 0 1
1 0 1 0 1 1 0 1 0 0
1 1 1 0 1 0 0 1 0 0
0 0 0 0 0 0 1 1 1 1
1 1 1 1 1 1 1 0 0 0
0 0 0 1 0 0 0 0 0 0
1 1 1 1 1 0 1 1 0 1
0 0 0 0 0 0 1 0 0 1
1 1 1 1 1 0 0 0 0 0
0 0 0 0 0 0 1 1 1 1


Код.
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void is_col(int**, int row, int col, const int size);
void is_row(int**, int row, int col, const int size);
void count_island(int**, const int size, int& len);
 
int  main(void) {
     int size = 0, r, c;
     FILE* fp = fopen("matrix.txt", "r"); // открываем файл
     if(! fp)
         exit(1);
     fscanf(fp, "%2d", &size); // считываем sqrt(размер) матрицы
     fgetc(fp);
     if(! size) {
           fclose(fp);
           exit(2);
      }
      // выделяем динамическую память под матрицу
      int** mat  = new int*[size];
      for(r = 0; r < size; r++)
            mat[r] = new int[size];
 
      char  buf[255];
      char* str;
 
      memset(buf, '\0', sizeof(buf));
      for(r = 0; fgets(buf, sizeof(buf), fp); r++) { // считыаем матрицу из файла
               for(c = 0, str = strtok(buf, " "); str; str = strtok(NULL, " "), c++)
                     mat[r][c] = atoi(str);
      }
      fclose(fp);
 
      int length = 0;
      count_island(mat, size, length);  // подсчитываем острова матрицы
 
     // выводим результат на дисплей и в файл
     fp = fopen("D:\\result.txt", "w+");
     fprintf(fp, "%d", length);
     fclose(fp);
     printf("island count: %d\n", length);
    
     // освобождаем занятую динамическую память
     for(r = 0; r < size; r++) {
            delete[] mat[r];
            mat[r] = NULL;
     }
     delete[] mat;
     mat = NULL;
 
    getchar();
    return 0;
}
 
void is_row(int** mat, int row, int col,  const int size) {
  int r;
  for(r = row + 1; r < size; r++) {
      if(mat[r][col]) {
            is_col(mat, r, col, size);
            mat[r][col] = 0;
      } else
            break;
  } 
  for(r = row - 1; r >= 0; r--) {
      if(mat[r][col]) {
           is_col(mat, r, col, size);
           mat[r][col] = 0;
      } else
          break;
  }
}
 
void is_col(int** mat, int row, int col, const int size) {
  int c;
  for(c = col + 1; c < size; c++) {
       if(mat[row][c]) {
            is_row(mat, row, c, size);
            mat[row][c] = 0;
       } else
            break;
  } 
  for(c = col - 1; c >= 0; c--) {
       if(mat[row][c]) {
           is_row(mat, row, c, size);
           mat[row][c] = 0;
       } else
           break;
  }
}
 
void count_island(int** mat, const int size, int& len) {
    int r, c;
prev:
    for(r = 0; r < size; r++) {
          for(c = 0; c < size; c++) {
               if(mat[r][c]) {
                    is_row(mat, r, c, size);
                    is_col(mat, r, c, size);
                    mat[r][c] = 0;
                    len++;
                    goto prev;
                }
          }
    }
}
Результат: 7 - островов в матрице
Поиск вёлся по такому принципу как показан на картинке ниже.
1
Изображения
 
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.09.2011, 16:50
Привет! Вот еще темы с ответами:

Программа для сжатия черно-белых изображений - C++
Одной из самых часто встречаемых задач в информатике является задача сжатия данных. Рассмотрим частный случай этой проблемы, а именно —...

Определить, может ли белая фигура пойти на поле - C++
Пожалуйста помогите, очень презнателен... 1. Поле шахматной доски определяется парой натуральных чисел, каждое из которых не...

Как преобразовать изображение BMP в черно-белое и не только? - C++
Здравствуйте! В общем стоит задача сделать консольный фото редактор, который выполнял бы ряд задач. Не без помощи гугла, часть из них я...

Определить поля, на которые может пойти белая ладья - C++
Шахматную доску представить в виде квадратного символьного массива размером 8х8. Позиция каждой фигуры определяется парой натуральных...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.