Как найти береговую линию острова

Береговая линия — остров

Cтраница 1

Береговая линия острова или массива земли моделируется с помощью добавления полигона отсечения. Этот полигон определяет оболочку или внешнее ребро набора граней Оболочка обрисовывает берег или проектную границу.
 [1]

Береговая линия острова или массива земли моделируется с помощью добавления полигона отсечения. Этот полигон определяет оболочку или внешнее ребро набора граней. Оболочка обрисовывает берег или проектную границу.
 [2]

Береговая линия острова имеет форму эллипса с полуосями О А и 0В, причем ОЛ 4 км, ОВ 3 км. Берег представляет собой прямую линию, пересекающую луч ОА в точке С и луч 0В в точке D.
 [3]

То есть в рамках этой модели береговые линии островов могут быть спрямляемы. В этом случае общая величина D определяет не степень иррегулярности, а единственно степень фрагментации.
 [4]

Конкретные случаи охватывают широкий диапазон от береговых линий островов в архипелаге до такого важного физического феномена, как перколяция. Начальные разделы главы содержат новый материал, которого не было во Фракталах 1977 г.; остальная часть также в значительной степени обновлена.
 [5]

Для семейства подобных островов различных размеров отношение длины нефрактальной береговой линии любого острова к квадратному корню из его площади не зависит от размера острова.
 [6]

Если взглянуть с самолета на лес, за которым никто систематически не присматривает, можно увидеть, что его граница весьма напоминает береговую линию острова. Контуры отдельных групп деревьев чрезвычайно извилисты и изрезаны, и по соседству с каждой большой группой расположены меньшие группы различного размера.
 [7]

Экспериментальные данные оказываются настолько хороши, что мы можем сразу же перейти к более тонкому сопоставлению. D ( береговой линии островов) систематически составляют величину порядка нескольких сотен. Первое возможное объяснение заключается в погрешности оценки. Например, высокочастотная область спектра содержит огромное количество постороннего шума, а значит, ее принимать в рассмотрение не следует. Кроме того, мы весьма вольно обходимся с озерами и прибрежными островами: включаем первые и исключаем вторые, поскольку они должным образом не определены.
 [8]

Следовательно, дуга АВ переходит в отрезок АС. Таким образом, береговая линия острова при указанном отображении переходит в контур квадрата.
 [9]

То есть суммарная длина береговой линии маленьких островов становится бесконечной. По мере того, как продвигается построение и увеличивается число островов, длина побережья наибольшего острова становится величиной относительно пренебрежимой.
 [10]

Первичным элементом кривой является квадрат со стороной а. Генератор кривой при замене каждой ее стороны добавляет малый полуостров и вырезает участок побережья такого же размера. Здесь D 3 / 2 есть фрактальная размерность береговой линии острова, ограниченного квадратичной кривой Кох.
 [11]

Однако расхождение может быть вызвано и вполне реальными причинами. По сути дела, почти идентичность значений D наводит на мысль, что исследуемые материалы оказались гораздо более изотропными, нежели мы предполагали. Если же рассмотреть образцы, которые просто обязаны быть анизотропными ( исходя из метода их получения), то мы увидим, что значения D спектра и D береговой линии островов и в самом деле очень различны.
 [12]

Фрактальные объекты повсеместно встречаются в природе. Теперь читатель вполне обоснованно ожидает увидеть фрактальную модель практически во всем, что окружает нас во внешнем мире. Это модели снежинок, деревьев, кустов, листьев и тому подобных объектов. Конечно, фигура снежинки может одновременно служить моделью береговой линии острова, а дерево может быть использовано для представления анатомических объектов, таких, например, как бронхиальное или артериальное дерево.
 [13]

Сколь велика длина береговой линии Норвегии. Взгляните на рис. 2.1. В масштабе карты хорошо видны глубокие фиорды на западном побережье. Более мелкие детали очертаний побережья к северо-востоку от южной оконечности различимы хуже, но смею уверить вас в том, что на картах, которыми я пользуюсь, плавая на яхте в тех краях, береговая линия выглядит так же, как западное побережье на рис. 2.1. Идя под парусом, вы то и дело встречаете скалы, острова, бухты, обрывы и узкости, которые похожи друг на друга, даже если они не обозначены на моих подробных картах. Прежде чем ответить на вопрос, с которого начинается эта глава, необходимо решить, стоит ли включать в береговую линию острова.
 [14]

Страницы:  

   1

Чему посвящен раздел

Данный раздел тесно связан с предыдущим, в котором речь шла о ЦМР(DEM), ввиду того, что береговую линию
мирового океана можно использовать для коррекции значений пикселов ЦМР.

Поэтому здесь обсуждается задача получения достаточно точной береговой линии в векторном виде на все прибрежные районы Земли. Точность ее положения должна быть соизмерима, но не хуже величины, равной размеру одного пиксела ЦМР. Для ЦМР с разрешением 1 угл. сек., выпуск которой ожидается в 2015г., — это 30 метров. Именно с такой точностью нужна береговая линия.

Источники исходных данных

Из каких открытых ресурсов можно взять исходные данные?

Перечислим некоторые из них.

1. Векторная береговая линия, полученная по DEM, как описано в предыдущем разделе.

2. Векторная карта США VMap0 масштаба 1:1М, доступная для скачивания и имеющая данные на весь мир, в том числе и береговую линию.

3. Векторная карта США VMap1 масштаба 1:250К, доступная для скачивания примерно на 1/3 территории Земли.

Источники 2 и 3 плохо подходят по точности данных. Точность карт масштаба 1:250К составляет величину около 100 метров, что в 3 раза хуже требуемой.

По точности подошли бы векторные карты масштаба 1:50К и крупнее.

4. Векторная карта OSM (проекта OpenStreetMap), имеющая данные почти на весь мир. К сожалению, данные OSM существенно разнятся по точности представления в зависимости от региона Земли.

5. Снимки GoogleEarth на всю территорию Земли, представленные в растровом виде. Они доступны только для просмотра, однако инструментарий программы GoogleEarth достаточен и для организации проверки векторных данных и для их коррекции. Недостаток — большая трудоемкость работ.

Наверняка есть еще другие открытые источники, которые можно использовать. Я надеюсь пополнить данный список, в том числе и с помощью читателей и пользователей моих данных.

Примеры полученной береговой линии




Снимок и карта Google на фрагмент территории Швеции (57:32:18N 16:44:48E)




Береговая линия DEM и карты OSM на ту же территорию



Береговая линия настоящего проекта

Скачать примеры в формате KML можно здесь:

на район Нигерии

на район Норвегии

на район Сицилии

Комментарий к примерам

1. Береговые линии континентов и островов (даже если они замкнуты) представлены в KML-файле линиями (LineString). Также в KML-файлах есть полигоны (Polygon), которые могут иметь как внешний контур, так и множество внутренних контуров. Полигонами оцифрованы озера, расположенные вблизи береговой линии, но не имеющие выход в океан. Высота уровня воды озер задается значением третьей координаты (как правило, высота равна 0).

2. Снимки, отображаемые GoogleEarth, состоят из множества состыкованных фрагментов. Бывают случаи, когда погрешность состыковки составляет 30 и более метров (особенно для островных северных районов). Поэтому можно наблюдать ситуации, когда часть береговой линии хорошо ложится на снимки GoogleEarth, а часть — смещена на некоторую величину.

Примеры ошибок состыковки фрагментов: (62:11:27N 5:35:28E примерно 40м.), (55:38:46N 10:09:46E 150м. между 2011г и 2012г), (17:35:10N 38:50:12E 40м.), (16:18:25N 39:11:54E 60м.), (16:06:38N 39:14:00E 70м.), (28:37:13N 34:47:39E 20м.), (22:09:59N 36:46:28E 80м.), (21:56:18N 36:53:01E 30м.), (21:42:06N 36:53:57E 40м.), (21:24:41N 37:00:16E 25м.), …

3. На территории выше 70 градусов северной широты нет ни хороших векторных данных, ни хороших по качеству снимков. На эти территории береговая линия не строилась.

Береговая линия — сложные (спорные) моменты

1. Где проходит линия раздела океана и впадающей в океан реки?

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

Для определения места поднятия уровня речной воды на значимую величину, а следовательно и линии раздела реки и океана, используется ЦМР.

Отметим, что во многих равнинных и низменных прибрежных районах Земли можно наблюдать «глубокий заход» океана вглубь континента по руслам широких рек.

2. Имеют ли береговую линию маленькие острова, камни, торчащие из воды и т.п.?

Да, если наибольший линейный размер образования больше 30 метров.

3. Лагуны, пересыхающие водоемы, заливаемые приливами территории и т.п. — это суша или океан?

Это сложный вопрос, который решается оператором-дешифровщиком, на основе своего опыта распознавания космических снимков GoogleEarth.

4. Дамбы (молы, причалы) и мосты — это суша или океан?

Если ширина дамбы более 30 метров, то это суша.
Мост сушей не является.

Распространение данных

Созданные данные могут быть переданы заинтересованным лицам для некоммерческого использования в случае выполнения двух условий:

1. Наличие данных на требуемую территорию (проект не закончен, данные еще формируются).

2. Пользователь дает обязательство проверить качество данных и выслать мне информацию о замеченных ошибках.

На главную

virtuos553

49 / 4 / 0

Регистрация: 18.12.2012

Сообщений: 247

Записей в блоге: 1

1

Дополнить функционал программы — найти остров с наибольшей береговой линией

29.01.2014, 20:30. Показов 1296. Ответов 15

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Написал прогу которая находит кол-во островов , как ее дополнить, чтобы находила остров с наибольшей береговой линией и выводила площадь этой береговой линии.

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
#include<iostream>
#include<fstream>
using namespace std;
 
int func(int **mas, int i, int j, int n, int m)
{
    int k, sum;
    k = 0;
 
    sum = 1;
 
    mas[i][j] = 2;
    
 
    if ((j!=(m-1))&&(mas[i][j + 1] == 1))
    {
        mas[i][j + 1] = 2;
        func(mas, i, j + 1,n,m);
        sum++;
    }
    if ((j!=0)&&(mas[i][j - 1] == 1))
    {
        mas[i][j - 1] = 2;
        func(mas, i, j - 1,n,m);
        sum++;
    }
    if ((i!=(n-1))&&(mas[i + 1][j] == 1))
    {
        mas[i + 1][j] = 2;
        func(mas, i + 1, j,n,m);
        sum++;
    }
    if ((i!=0)&&(mas[i - 1][j] == 1))
    {
        mas[i - 1][j] = 2;
        func(mas, i - 1, j,n,m);
        sum++;
    }
 
    
 
    
    k++;
    return k;
}
 
 
 
 
 
int main()
{
    int n, m,i,j ,kol;
    kol = 0;
 
 
 
    ifstream f("C:\mipt1\input.txt");
 
 
    
 
    f >> n >> m;
    int **mas = new int*[n]; // выделяем память под m строк
    for (i = 0; i < n; i++)
    {
        mas[i] = new int[m]; // для каждой строки выделяем память под n элементов
        for (j = 0; j < m && !f.eof(); j++)
        {
            f >> mas[i][j]; // считываем очередной элемент
            
        }
        
    }
 
 
 
 
 
    for (i = 0; i < n; i++)//считываем каждый элемент массива
    {
 
        for (j = 0; j < m; j++)
        {
            if (((mas[i][j] == 1) && (j != (m - 1)) && (mas[i][j + 1] == 1)) || ((mas[i][j] == 1) && (j != 0) && (mas[i][j - 1] == 1)) || ((mas[i][j] == 1) && (i != (n - 1)) && (mas[i + 1][j] == 1)) || ((mas[i][j] == 1) && (i !=0) && (mas[i-1][j ] == 1)))//смотрим есть ли снизу, сверху , справа или слева от 1 еще 1 и при этом не выходим за границы массива, если это все так то вызываем рекурсивную функцию
            {
                kol=func(mas, i, j,n,m)+kol;//кол-во вызовов по сути и будет кол-во островов
                
            }
 
        }
    }
 
 
        
        cout << "n" << kol;
 
    system("pause");
 
}



0



Эксперт С++

4726 / 2547 / 757

Регистрация: 18.08.2009

Сообщений: 4,568

29.01.2014, 21:14

2

У Вас код не правильно работает (хоть и не проверял его). Попробуйте такой тест: 1 или несколько островов размером в одну «клетку». Ни одного не найдет программа.



0



49 / 4 / 0

Регистрация: 18.12.2012

Сообщений: 247

Записей в блоге: 1

29.01.2014, 23:05

 [ТС]

3

Так и должно быть, там дана карта, 1 земля, 0 — вода, островм считается две и более земель, если у них одинаковое ребро



0



valeriikozlov

Эксперт С++

4726 / 2547 / 757

Регистрация: 18.08.2009

Сообщений: 4,568

30.01.2014, 06:06

4

тогда проверяйте:

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
#include<iostream>
#include<fstream>
using namespace std;
 
int func(int **mas, int i, int j, int n, int m)
{
    int k, sum, s=1;
    k = 0;
 
    sum = 1;
 
    mas[i][j] = 2;
    
 
    if ((j!=(m-1))&&(mas[i][j + 1] == 1))
    {
        mas[i][j + 1] = 2;
        s+=func(mas, i, j + 1,n,m);
        sum++;
    }
    if ((j!=0)&&(mas[i][j - 1] == 1))
    {
        mas[i][j - 1] = 2;
        s+=func(mas, i, j - 1,n,m);
        sum++;
    }
    if ((i!=(n-1))&&(mas[i + 1][j] == 1))
    {
        mas[i + 1][j] = 2;
        s+=func(mas, i + 1, j,n,m);
        sum++;
    }
    if ((i!=0)&&(mas[i - 1][j] == 1))
    {
        s+=mas[i - 1][j] = 2;
        func(mas, i - 1, j,n,m);
        sum++;
    }
 
    
 
    
    k++;
    return s;
}
 
 
 
 
 
int main()
{
    int n, m,i,j ,kol, S=0, t;
    kol = 0;
 
 
 
    ifstream f("C:\mipt1\input.txt");
 
 
    
 
    f >> n >> m;
    int **mas = new int*[n]; // выделяем память под m строк
    for (i = 0; i < n; i++)
    {
        mas[i] = new int[m]; // для каждой строки выделяем память под n элементов
        for (j = 0; j < m && !f.eof(); j++)
        {
            f >> mas[i][j]; // считываем очередной элемент
            
        }
        
    }
 
 
 
 
 
    for (i = 0; i < n; i++)//считываем каждый элемент массива
    {
 
        for (j = 0; j < m; j++)
        {
            if (((mas[i][j] == 1) && (j != (m - 1)) && (mas[i][j + 1] == 1)) || ((mas[i][j] == 1) && (j != 0) && (mas[i][j - 1] == 1)) || ((mas[i][j] == 1) && (i != (n - 1)) && (mas[i + 1][j] == 1)) || ((mas[i][j] == 1) && (i !=0) && (mas[i-1][j ] == 1)))//смотрим есть ли снизу, сверху , справа или слева от 1 еще 1 и при этом не выходим за границы массива, если это все так то вызываем рекурсивную функцию
            {
                t=func(mas, i, j,n,m);//кол-во вызовов по сути и будет кол-во островов
                if(t>S)
                    S=t;
                
            }
 
        }
    }
 
 
        
        cout << "n" << S;
 
    system("pause");
 
}



0



49 / 4 / 0

Регистрация: 18.12.2012

Сообщений: 247

Записей в блоге: 1

30.01.2014, 13:55

 [ТС]

5

не работает, тестил на таком примере.
6 6
1 1 1 1 1 1
1 1 0 0 0 1
1 0 1 1 0 1
1 0 1 1 0 1
1 0 0 0 0 1
1 1 1 1 1 1

выводит 18, а должен 20



0



Эксперт С++

4726 / 2547 / 757

Регистрация: 18.08.2009

Сообщений: 4,568

30.01.2014, 15:05

6

Цитата
Сообщение от virtuos553
Посмотреть сообщение

не работает, тестил на таком примере.
6 6
1 1 1 1 1 1
1 1 0 0 0 1
1 0 1 1 0 1
1 0 1 1 0 1
1 0 0 0 0 1
1 1 1 1 1 1
выводит 18, а должен 20

давайте полное условие задачи выкладывайте (а то додумывать нехочется). Дальше поясняйте вот эту фразу:

Цитата
Сообщение от virtuos553
Посмотреть сообщение

чтобы находила остров с наибольшей береговой линией и выводила площадь этой береговой линии.

Что входит в береговую линию? Точка в которой записана 1, рядом с которой есть точка, в которую записан 0? Если так то как считать рядом? Только верх/низ, лево/право (или наискосок тоже)?
Что понимается под площадью береговой линии? Все точки, в которых записаны 1 и рядом с которыми находятся точки, в которых записаны 0?

Добавлено через 5 минут
тогда пишите полное условие задачи, а то додумывать не получается. И после этого расшифруйте эту фразу:

Цитата
Сообщение от virtuos553
Посмотреть сообщение

чтобы находила остров с наибольшей береговой линией и выводила площадь этой береговой линии.

Что значит береговая линия? Все точки с 1, рядом с которыми есть точки с 0? Как рядом: только верх/низ, лево/право или наискосок тоже?
Площадь береговой линии — это все вышеперечисленные точки?



0



Почетный модератор

Эксперт С++

5850 / 2861 / 392

Регистрация: 01.11.2011

Сообщений: 6,907

30.01.2014, 15:09

7

___

Цитата
Сообщение от valeriikozlov
Посмотреть сообщение

Что входит в береговую линию?

18

1 1 1 1 1 1
1 1 0 0 0 1
1 0 1 1 0 1
1 0 1 1 0 1
1 0 0 0 0 1
1 1 1 1 1 1

20

1 1 1 1 1 1
1 1 0 0 0 1
1 0 1 1 0 1
1 0 1 1 0 1
1 0 0 0 0 1
1 1 1 1 1 1



0



valeriikozlov

Эксперт С++

4726 / 2547 / 757

Регистрация: 18.08.2009

Сообщений: 4,568

30.01.2014, 15:34

8

Хотелось бы чтобы ТС сам ответил (тем более для ответа 18 код не так считает), ну да ладно возьмем за основу ответ SatanaXIII, тады так:

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
#include<iostream>
#include<fstream>
using namespace std;
 
int func(int **mas, int i, int j, int n, int m)
{
    int k, sum, s=0;
    k = 0;
 
    sum = 1;
 
    mas[i][j] = 2;
    if (j!=m-1)
    {
      if(mas[i][j + 1] == 1)
        s+=func(mas, i, j + 1,n,m);
      else
        k=1; 
      if((i>0 && mas[i-1][j+1]==0) ||(i<n-1 && mas[i+1][j+1]==0 ))
        k=1;
    } 
    if (j!=0)
    {
      if(mas[i][j - 1] == 1)
        s+=func(mas, i, j - 1,n,m);
      else
        k=1;
      if((i>0 && mas[i-1][j-1]==0) ||(i<n-1 && mas[i+1][j-1]==0 ))
        k=1;    
    }
    if (i!=n-1)
    {
      if(mas[i + 1][j] == 1)       
        s+=func(mas, i + 1, j,n,m);
      else
        k=1;
    }
    if (i!=0)
    {
      if(mas[i - 1][j] == 1)
        s+=func(mas, i - 1, j,n,m);
     else
        k=1;
    } 
    
    return s+k;
}
 
 
 
 
 
int main()
{
    int n, m,i,j ,kol, S=0, t;
    kol = 0;
 
 
 
    ifstream f("C:\mipt1\input.txt");
 
 
    
 
    f >> n >> m;
    int **mas = new int*[n]; // выделяем память под m строк
    for (i = 0; i < n; i++)
    {
        mas[i] = new int[m]; // для каждой строки выделяем память под n элементов
        for (j = 0; j < m && !f.eof(); j++)
        {
            f >> mas[i][j]; // считываем очередной элемент
            
        }
        
    }
 
 
 
 
 
    for (i = 0; i < n; i++)//считываем каждый элемент массива
    {
 
        for (j = 0; j < m; j++)
        {
            if (((mas[i][j] == 1) && (j != (m - 1)) && (mas[i][j + 1] == 1)) || ((mas[i][j] == 1) && (j != 0) && (mas[i][j - 1] == 1)) || ((mas[i][j] == 1) && (i != (n - 1)) && (mas[i + 1][j] == 1)) || ((mas[i][j] == 1) && (i !=0) && (mas[i-1][j ] == 1)))//смотрим есть ли снизу, сверху , справа или слева от 1 еще 1 и при этом не выходим за границы массива, если это все так то вызываем рекурсивную функцию
            {
                t=func(mas, i, j,n,m);//кол-во вызовов по сути и будет кол-во островов
                if(t>S)
                    S=t;
                
            }
 
        }
    }
 
 
        
        cout << "n" << S;
 
    system("pause");
 
}



0



49 / 4 / 0

Регистрация: 18.12.2012

Сообщений: 247

Записей в блоге: 1

30.01.2014, 16:37

 [ТС]

9

береговая линия это ребро между 0 и 1

Пример.
0 0 0 0
0 1 1 0
0 0 1 0
0 0 0 0
тут береговая линия равна 8

0 0 0
0 1 0
0 0 0

тут 4

Добавлено через 1 минуту
если внутри острова есть озеро, то длину береговой линии озера тоже надо считать

0 0 0 0 0
0 1 1 1 0
0 1 0 1 0
0 1 1 1 0
0 0 0 0 0
тут длина береговой линии острова равна 16

Добавлено через 3 минуты
Также считать , что вокруг карты вода(за пределами массива)

Добавлено через 2 минуты

Цитата
Сообщение от SatanaXIII
Посмотреть сообщение

___

[SPOILER=18]
[SPOILER=20]

в его примере береговая линия будет очень большой, учитывая , что за пределами вода



0



Эксперт С++

4726 / 2547 / 757

Регистрация: 18.08.2009

Сообщений: 4,568

30.01.2014, 17:34

10

SatanaXIII, не угадал )



0



49 / 4 / 0

Регистрация: 18.12.2012

Сообщений: 247

Записей в блоге: 1

30.01.2014, 17:41

 [ТС]

11

можешь переделать код под такое определение береговой линии?



0



valeriikozlov

Эксперт С++

4726 / 2547 / 757

Регистрация: 18.08.2009

Сообщений: 4,568

30.01.2014, 20:16

12

позднее (когда приеду, домой где есть компилятор)

Добавлено через 2 часа 31 минуту

Цитата
Сообщение от virtuos553
Посмотреть сообщение

береговая линия это ребро между 0 и 1

тогда тест:

Цитата
Сообщение от virtuos553
Посмотреть сообщение

Пример.
0 0 0 0
0 1 1 0
0 0 1 0
0 0 0 0
тут береговая линия равна 8

правильный

Цитата
Сообщение от virtuos553
Посмотреть сообщение

0 0 0
0 1 0
0 0 0
тут 4

неправильный (где-то раньше звучало, что остров — это не менее двух 1 рядом)

Цитата
Сообщение от virtuos553
Посмотреть сообщение

0 0 0 0 0
0 1 1 1 0
0 1 0 1 0
0 1 1 1 0
0 0 0 0 0
тут длина береговой линии острова равна 16

правильный

Цитата
Сообщение от virtuos553
Посмотреть сообщение

6 6
1 1 1 1 1 1
1 1 0 0 0 1
1 0 1 1 0 1
1 0 1 1 0 1
1 0 0 0 0 1
1 1 1 1 1 1
выводит 18, а должен 20

неправильный (посчитайте вручную, получится 16)

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
#include<iostream>
#include<fstream>
using namespace std;
 
int func(int **mas, int i, int j, int n, int m)
{
    int k, sum, s=0;
    k = 0;
 
    sum = 1;
 
    mas[i][j] = 2;
    if (j!=m-1)
    {
      if(mas[i][j + 1] == 1)
        s+=func(mas, i, j + 1,n,m);
      else
          if(mas[i][j + 1] == 0)
              s++;
    } 
    if (j!=0)
    {
      if(mas[i][j - 1] == 1)
        s+=func(mas, i, j - 1,n,m);
      else
          if(mas[i][j - 1] == 0)
       s++;
    }
    if (i!=n-1)
    {
      if(mas[i + 1][j] == 1)       
        s+=func(mas, i + 1, j,n,m);
      else
          if(mas[i + 1][j] == 0)
        s++;
    }
    if (i!=0)
    {
      if(mas[i - 1][j] == 1)
        s+=func(mas, i - 1, j,n,m);
      else
          if(mas[i - 1][j] == 0)
          s++;     
    } 
    
    return s;
}
 
 
 
 
 
int main()
{
    int n, m,i,j ,kol, S=0, t;
    kol = 0;
 
 
 
    //ifstream f("C:\mipt1\input.txt");
 ifstream f("input.txt");
 
    
 
    f >> n >> m;
    int **mas = new int*[n]; // выделяем память под m строк
    for (i = 0; i < n; i++)
    {
        mas[i] = new int[m]; // для каждой строки выделяем память под n элементов
        for (j = 0; j < m && !f.eof(); j++)
        {
            f >> mas[i][j]; // считываем очередной элемент
            
        }
        
    }
 
 
 
 
 
    for (i = 0; i < n; i++)//считываем каждый элемент массива
    {
 
        for (j = 0; j < m; j++)
        {
            if (((mas[i][j] == 1) && (j != (m - 1)) && (mas[i][j + 1] == 1)) || ((mas[i][j] == 1) && (j != 0) && (mas[i][j - 1] == 1)) || ((mas[i][j] == 1) && (i != (n - 1)) && (mas[i + 1][j] == 1)) || ((mas[i][j] == 1) && (i !=0) && (mas[i-1][j ] == 1)))//смотрим есть ли снизу, сверху , справа или слева от 1 еще 1 и при этом не выходим за границы массива, если это все так то вызываем рекурсивную функцию
            {
                t=func(mas, i, j,n,m);//кол-во вызовов по сути и будет кол-во островов
                if(t>S)
                    S=t;
                
            }
 
        }
    }
 
 
        
        cout << "n" << S;
 
    system("pause");
 
}



0



Почетный модератор

Эксперт С++

5850 / 2861 / 392

Регистрация: 01.11.2011

Сообщений: 6,907

31.01.2014, 08:27

13

Цитата
Сообщение от valeriikozlov
Посмотреть сообщение

SatanaXIII, не угадал )


Жесть.

Цитата
Сообщение от virtuos553
Посмотреть сообщение

в его примере береговая линия будет очень большой, учитывая , что за пределами вода

Это ваш пример:

Цитата
Сообщение от virtuos553
Посмотреть сообщение

не работает, тестил на таком примере.
6 6
1 1 1 1 1 1
1 1 0 0 0 1
1 0 1 1 0 1
1 0 1 1 0 1
1 0 0 0 0 1
1 1 1 1 1 1
выводит 18, а должен 20



0



49 / 4 / 0

Регистрация: 18.12.2012

Сообщений: 247

Записей в блоге: 1

31.01.2014, 14:06

 [ТС]

14

я поправился позже, мой косяк, там конечно не 18 и не 20, а больше намного

Добавлено через 2 часа 18 минут
а можете сделать, чтобы и считала что за пределами карты вода везде?



0



valeriikozlov

Эксперт С++

4726 / 2547 / 757

Регистрация: 18.08.2009

Сообщений: 4,568

01.02.2014, 07:02

15

Лучший ответ Сообщение было отмечено virtuos553 как решение

Решение

Цитата
Сообщение от virtuos553
Посмотреть сообщение

а можете сделать, чтобы и считала что за пределами карты вода везде?

встречный вопрос: а можете свои фантазии сразу написать?

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
#include<iostream>
#include<fstream>
using namespace std;
 
int func(int **mas, int i, int j, int n, int m)
{
    int k, sum, s=0;
    k = 0;
 
    sum = 1;
 
    mas[i][j] = 2;
    if (j!=m-1)
    {
      if(mas[i][j + 1] == 1)
        s+=func(mas, i, j + 1,n,m);
      else
          if(mas[i][j + 1] == 0)
              s++;
    } 
    if (j!=0)
    {
      if(mas[i][j - 1] == 1)
        s+=func(mas, i, j - 1,n,m);
      else
          if(mas[i][j - 1] == 0)
       s++;
    }
    if (i!=n-1)
    {
      if(mas[i + 1][j] == 1)       
        s+=func(mas, i + 1, j,n,m);
      else
          if(mas[i + 1][j] == 0)
        s++;
    }
    if (i!=0)
    {
      if(mas[i - 1][j] == 1)
        s+=func(mas, i - 1, j,n,m);
      else
          if(mas[i - 1][j] == 0)
          s++;     
    } 
    if(i==0)
        s++;
    if(j==0)
        s++;
    if(i==n-1)
        s++;
    if(j==m-1)
        s++;
    
    return s;
}
 
 
 
 
 
int main()
{
    int n, m,i,j ,kol, S=0, t;
    kol = 0;
 
 
 
    //ifstream f("C:\mipt1\input.txt");
 ifstream f("input.txt");
 
    
 
    f >> n >> m;
    int **mas = new int*[n]; // выделяем память под m строк
    for (i = 0; i < n; i++)
    {
        mas[i] = new int[m]; // для каждой строки выделяем память под n элементов
        for (j = 0; j < m && !f.eof(); j++)
        {
            f >> mas[i][j]; // считываем очередной элемент
            
        }
        
    }
 
 
 
 
 
    for (i = 0; i < n; i++)//считываем каждый элемент массива
    {
 
        for (j = 0; j < m; j++)
        {
            if (((mas[i][j] == 1) && (j != (m - 1)) && (mas[i][j + 1] == 1)) || ((mas[i][j] == 1) && (j != 0) && (mas[i][j - 1] == 1)) || ((mas[i][j] == 1) && (i != (n - 1)) && (mas[i + 1][j] == 1)) || ((mas[i][j] == 1) && (i !=0) && (mas[i-1][j ] == 1)))//смотрим есть ли снизу, сверху , справа или слева от 1 еще 1 и при этом не выходим за границы массива, если это все так то вызываем рекурсивную функцию
            {
                t=func(mas, i, j,n,m);//кол-во вызовов по сути и будет кол-во островов
                if(t>S)
                    S=t;
                
            }
 
        }
    }
 
 
        
        cout << "n" << S;
 
    system("pause");
 
}



1



49 / 4 / 0

Регистрация: 18.12.2012

Сообщений: 247

Записей в блоге: 1

01.02.2014, 14:44

 [ТС]

16

Спасибо, просто было интересно до конца рассмотреть и разобраться со всеми вариантами.



0



Независимо от того, где проходит ваше путешествие, его маршрут непременно коснется и попадет в одну из категорий, которые приведены ниже. Определившись с типом береговой линии, вы сможете с легкостью сосредоточиться на конкретных областях при планировании дальнейшей навигации.

Ледниковые ландшафты

Красота фьордов завораживает. Кажется, что сама природа не пожалела своих сил на создание подобного ландшафта и захватывающих пейзажей. Но за этой красотой стоит масса сложностей, ведь найти безопасную якорную стоянку на мелководье – задача не из легких.

В большинстве случаев центральная линия фьорда будет чистой и свободной от опасностей. И если говорить утрированно, выбирайте место «просто посередине».

Можно также прибегнуть к помощи зрительной оценки обстановки. В какой-то степени это облегчает плавание, и без этого никуда, особенно если эхолот добивая до глубины более 150 м, начинает давать сбой, показывая не вполне удовлетворительную картинку.

Т.к. поиск укрытия на мелководье является самой трудной частью в походе, на борту необходимо иметь не менее 80 метров якорной цепи. Которая, разумеется, вся тут же будет полностью вытравлена. Но знание береговой линии поможет.

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

Портсмут

Риасы

И хотя, когда слышишь слово «Риа» в голове возникакет ассоциация с Испанией, в Великобритании также есть несколько своих: Фалмут, Салкомб, Портсмут и др.

Риас (риа) – это затопленные речные долины, которые поистине являются одними из лучших мест для круизов в мире.

Сразу хотим предупредить: остерегайтесь обособленных скалистых пород и илистых берегов.

Шотландские озера, Портсмут, Фалмут, Галисия и Новая Англия – места, где доминируют риасы. Они прекрасно подходят для круизов, т.к. представляют собой глубокие, защищенные природные бухты с илистым дном, что является большим плюсом для постановки на якорь.

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

В эту ловушку может попасться неопытный яхтсмен. Риа может выглядеть достаточно широкой, но большая ее часть будет мелководной. Опасности, на которые следует обратить внимание, – это обнаженные скалистые породы, крутые илистые отмели по обеим сторонам русла реки и извилистые протоки в пределах открытого водоема.

Прелесть риасов заключается в том, что вы можете пустить в ход и отработать все свои навыки: очертание дна поможет определить русло, окрестности обычно достаточно просматриваемы для визуальной навигации, вы можете изучить ландшафт, чтобы идентифицировать камни или мели, а также крутые или плавные склоны.

Реки

Поскольку река постепенно сужается, по мере отдаления от устья, на илистых берегах появляется область отложений, которая может со временем попадать в канал.

Большинство главных портов мира находятся вверх по течению. И т.к. судоходство достаточно развито, необходимо быть максимально внимательным, и следить не только за эхолотом, но также и за активным движением судов.

В отличие от фьордов, где самая самая большая глубина обычно находится посередине, извилистая река менее предсказуема. Глубокая вода чаще встречается на внешнем изгибе, а мелководье простирается как раз там, где течение слабее.

Согласно Правилу №9 МППСС-72: b. Судно длиной менее 20 м или парусное судно не должно затруднять движение такого судна, которое может безопасно следовать только в пределах узкого прохода или фарватера.

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

На участках рек с небольшим количеством навигационных отметок посмотрите на уклон берегов, чтобы определить форму дна реки. Крутизна берегов обычно соотносится с крутизной под водой.

По низкой воде, разумеется, проще ходить, т.к. большинство опасностей просматриваются на поверхности воды.

Барьерные острова

Сильные течения, сдвигая песчаные отмели, могут очень быстро помочь чартерам кануть в лету.

На северном побережье Голландии и Германии находится не глубокое внутреннее море под названием Ваддензе, которое находится за Фризскими островами, защитной полосой песчаных дюн.

Формировавшиеся под воздействием волн на протяжении тысяч лет, они представляют собой тип береговой линии, известный как Барьерные острова. Эти постоянно меняющиеся побережья можно встретить во всем мире.

Обычно они образуются в районах с приливно-отливной зоной в 1-2 м. Хоть этот диапазон невелик, тем не менее, между островами могут возникать приливы и отливы. Сильные течения создают позади мелководья илистые лабиринты, по которым можно пройти на яхтах исключительно во время приливов.

Но полагаться на зрительную оценку местности не стоит. Т.к. сами острова будут лежать низко, не имея никаких видимых признаков. А в связи с замутненностью воды, дно также будет просматриваться плохо.

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

Если вы не знаете, на какой стороне канала вы находитесь, слегка отверните нос лодки, чтобы узнать, что об этом думает ваш эхолот. Если что-то не так, он сразу подаст вам сигнал.

Важно! Необходимо пользоваться свежеобновленными версиями карт. Так как судоходные русла могут часто менять свое положение.

Даже если вы решили ходить вблизи от основных портов, на подходе к которым дно обычно хорошо расчищают и периодически углубляют, все равно дождитесь прилива и убедитесь, что ваша яхта способна выдержать удар килем, так как это практически неизбежно!

Дельты и Лиманы

Зрительная ориентация возможна лишь на чистой воде, как, например, на реке Эрм, на юге графства Девон, Юго-Западная Англия. Но это не сработает в заиленных водах Восточного побережья.

Когда река выходит за пределы своих берегов и впадает в море, она превращается в лиман, где ее осадочные отложения образуют песчаные и иловые отмели.

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

Лиманы, в отличие от морей, в основном песчаные.

В приливно-отливных зонах могут возникать перекрестные течения, пробивающиеся сквозь зазоры в песчаных отмелях, поэтому используйте любую возможность для наблюдения, ориентируясь по статичным объектам.

И снова возвращаясь к попыткам зрительной навигации. Здесь она также бесполезна. На окраинах дельты крупной реки  преобладают участки низинных земель, поэтому вокруг кроме пятидесяти оттенков бежевого увидеть нечего.

Поэтому для безопасного подхода вам понадобится пристальный взгляд только на эхолот и желательно хорошо знакомый маршрут.

Часто на хорошо освещённом лимане проще ориентироваться именно ночью. Мерцающие огни буев и бакенов хорошо просматриваемы, и снимать метки проще, чем днем, поэтому и шансов запутаться гораздо меньше.

Коралловые рифы

Кристально чистая вода, пальмовые берега и температура воды выше 20°C – райские регионы плавания, о которых мы все мечтаем. Но, несмотря на свою привлекательность, этот рай не лишен трудностей.

Кораллы образуют барьерный риф вокруг многих островов, который требует очень долгих переговоров, прежде чем вы сможете безопасно бросить якорь.

GPS пригоден только в том случае, если у вас есть точный план. Во многих этих областях картографические данные устаревшие, неполные или просто недостаточно детальные.

На чистой воде с песчаным дном можно определить глубину по ее цвету: чем глубже, тем темнее оттенок.

Тренируйте свой глазомер. Учитесь различать цвет воды на известной глубине, чтобы в критический момент вы могли с уверенностью в своих действиях выбрать якорную стоянку.

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

Но с восходом солнца и хорошей парой поляризационных солнцезащитных очков вы сможете с легкостью разглядеть «макушки» кораллов при спокойной воде, особенно если поставить на нос кого-то из членов экипажа в этих самых очках для наблюдения.

Планируйте свои подходы, когда дует легкий ветер с берега, и когда поверхность воды будет более гладкой. Убедитесь, что вы заранее согласовали с командой набор жестов, чтобы ваш наблюдатель указывал на опасность или показывал вам направление движения? Это существенная разница!

Вулканические острова

От Фарерских островов до Азорских, от Гавайских и до Канарских. Вулканические острова разбросаны по всему океану, и через них пролегают мировые парусные маршруты.

Их берега, как правило, обрывисты, с крутыми склонами, часто с возвышающимися вертикальными скалами и окаймленные полосами черных пляжей.

Из-за небольшого количества естественных входов судоходство в основном ограничивается искусственно созданными бухтами, где трудно найти защиту от извержения.

На самом деле, с быстро растущей волной возле многих островов Северной Атлантики вы более уязвимы на подходе в бухту или находясь рядом с ней, нежели в море.

Держитесь подальше, если вблизи береговой линии есть какая-либо активность, и если на входе в бухту нет широкого входа. Вероятность, что вы легко и без проблем заскочите в нее, достаточно мала.

Чтобы обезопасить себя во время накатов, заложите шпринг, чтобы снять часть напряжения со швартовых. Ведь даже в хорошую погоду волнение может приносить массу неудобств. Начиная от качки и рывков, и заканчивая раздражительным скрипом веревок.

Источник

Понравилась статья? Поделить с друзьями:
  • Как составить претензию на возврат денежных средств в банк
  • Эхинокактус вытянулся вверх как исправить
  • Как найти папку в телефоне thumbnails
  • Как найти свой стиль поведения
  • Как найти расстояние зная силу притяжения