Форум программистов, компьютерный форум CyberForum.ru

Найдите два слова с наилучшей рифмой и еще две задачи. - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Отличие static от объявление переменных ДО функции main http://www.cyberforum.ru/cpp-beginners/thread52763.html
Может быть я не совсем точно выразился в заголовке. Интересует отличие объявление переменных ДО функции main и объявление через static. По моим ощущениям если объявлено через static, то переменная существует всегда(даже при выходе из блока где она использовалась). Но ведь если просто объявить переменные до функции main они также будут видны везде. Поясните в чем загвоздка. Заранее спасибо. ...
C++ указатели когда работаешь с оператором delete нужно как-то показывать указатель?? Подробнее непишите пожалуйста?? http://www.cyberforum.ru/cpp-beginners/thread52761.html
Динамическое создание файлов. C++
Очень нужен пример такой на С/С++ (поф,ибо у меня DEV-C++).Кто поможет ?:( ЗЫ: Вылетает Unhandled Win32 exception =_= в моем примере
Как создают современные компьютерные игры? C++
Интересно, как создают современные компьютерные игры?? То есть на каком языке программирования?? Я слышал в основном на с++!!! Кто нибудь может мне помочь, хочу попробовать создать игру??
C++ Подскажите о операторе delete http://www.cyberforum.ru/cpp-beginners/thread52739.html
Как правильно пользоваться оператором удаления delete??
C++ Ключевое слово break Как правильно надо использовать ключевое слово break?? подробнее

Показать сообщение отдельно
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,302
30.09.2009, 17:33     Найдите два слова с наилучшей рифмой и еще две задачи.
Автор, держи третью задачу.
Пихай файлы в одну папку и компилируй main.cpp На DEV C++ работат, под остальные среды подгоняй сам.
Ввод, как и предусмотрено в условии

10 10
###...###.
..##.###..
##..###..#
####...##.
...####.##
####.####.
..#.#.#...
.##.###...
#.##....#.
###...####

Выдаёт 5

Слабые места:

1) вогнал в прогу бесконечный цикл
whilw (1) {}, из которого не могу выбраться. Страшного ничего, просто консоль придётся закрывать
мышью, если понадобится.

2) Массивы у меня динамические, по идее надо как-то память свобождать в конце каждого цикла, но я не
знаю, как

3) По окончании работы весь массив представляет из себя одни точки. Так что если надо сохранить-
сохраняй заранее.

Прога проходит по всем элементам массива, пока не наткнётся на #. После этого она вызывет
функцию rekursFunc () (определена в файле rekursFunc.cpp), которая рекурсивно проходит всем решёткам ЭТОГО блока решёток, превращая их в точки.
Соответственно, количество блоков увеличивается на 1.

Функция rekursFunc (), в свою очередь, по заходу в очередную клетку, вызывает другую функцию
zahod_v_kletku () (определена в "zahod_v_kletku.cpp"), которая определяет, куда идти дальше- прямо, налево или направо (прямо считается направление, откуда мы пришли)

Если идти некуда, очередная ветвь rekursFunc () закончилась.

В файле "globalnperemenie.h" глобальные переменные

Тестируй и присылай значения, которые не канают. Я буду исправлять. Но так-то я тестировал.
...Короче, я не знаю, как делать ссылки на файлы. Лови так.
Первый файл основной, потом заголовочный и два *cpp


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
#include <iostream>
using namespace std;
 
 
#include "globalnperemenie.h"
#include "rekursFunc.cpp" 
 
 
 
 
 
 
 
int main() {
 
while (1) {
 
 kolichestvo_blokov= 0;
 
 
 cout<<"Вводи количество столбцов и строк через пробел и массив потом"<<endl;
 fflush (stdin);
 cin>> M;
 cin>> N;
 
 //Массив тот самый
 char** array= new char* [M] ;
 
 //а ЭТО копия. С ней и будем работать, а array изменится в следующем цикле
 char** array_osn= array;
 
 //Это выделение памяти
 for (int i= 0; i< M; i++) {
  *array= new char[N];
   array++;
 }
 
 
 //Заполнение массива
 for (int i= 0; i< M; i++) {
  getchar ();
  for (int j= 0; j< N; j++) {
   array_osn [i] [j]= getchar ();
  }
 }
 
 
 
 
 for (int i= 0; i< M; i++) {
  for (int j= 0; j< N; j++) {
   if (array_osn [i] [j]== '#') {
 
    //Всякий раз если в функции rekursFunc если идёт работа с ПЕРВОЙ клеткой блока
    //(грубо говоря, если plus_ili_net==1) то глобальная переменная kolichestvo_blokov
    //инкременируется
    plus_ili_net= true;
 
    //сложность из-за того, что если это нулевая клетка може быть!
    rekursFunc (array_osn  ,i, (i==0 && j==0)?-1: j-1, i, j);
     
   }   
  }
 }
 
 
 cout<<"количество таких блоков равно"<<endl;
 
} 
 
 getchar ();
 getchar ();
 return 0;
}

C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <Windef.h>
 
//эТО СООТВЕТСВЕННО количество строк и столбцов массива
int M, N;
 
 
//Эта штука тоже должна быть доступна в функциях. Тоже глобальна поэтому. 
int kolichestvo_blokov= 0;
 
 
//Инкременируем kolichestvo_blokov в зависимомти от значения этой переменной
BOOL plus_ili_net;

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
#include "zahod_v_kletku.cpp"
 
//Параметры  i_tek,  j_tek есть параметры текущей клетки, i_pred и j_pred предыдущей
void rekursFunc (char** array  , int i_pred, int j_pred, int i_tek, int j_tek) {
 //Так, зашли в клетку. Если это первая клетка блока, то инкременируем kolichestvo_blokov;
 if (plus_ili_net) {
  kolichestvo_blokov++;
 }
 plus_ili_net=0;
  //Теперь нам нужно поийти дальше- налево, прямо или направо.
 //Но куда имено?
 //Вот для этой цели существуют такие переменые
 
  //пОКА ЧТО ЭТИ ПЕРЕММЕННЫЕ УСТАНОВЛЕНЫ В НУЛЬ. тО есть никуда нельхя идти (по умолчанию)
 //ТАК ли это на самом дее, нам предстоит выяснить с помощью функции zahod_v_kletku
 
 BOOL poidom_nalevo= false;  
 BOOL poidom_pramo= false;  
 BOOL poidom_napravo= false;  
 
 //По выходу из этой функции переменным, отвечающим за то, куда мы пойдём будут присвоено либо
 // false либо true
 zahod_v_kletku (array, i_pred, j_pred, i_tek, j_tek, &poidom_nalevo, &poidom_pramo, &poidom_napravo);
 
 //Теперь смотрим, куда можно пойти и туда идём. Но перед этим ОБЯЗАТЕЛЬНО превращаем
 //текущую клетку в точку
 array [i_tek] [j_tek]= '.';
 
 if (poidom_nalevo) {
  //Теперь надо разобраться с двумя вторыми аргументами
  //Это если движение было по горизонтали
  if (i_pred== i_tek) {
   //Если двигались слева направл
   if (j_pred<j_tek) {
    rekursFunc (array,i_tek, j_tek, i_tek-1, j_tek);
   }
 
   //аЭТО Если справа налево
   else {
    rekursFunc (array, i_tek, j_tek, i_tek+1, j_tek);
   }
  }
 
  //А это по ветикали
  else {
 
   //Если двигались снизу вверх 
   if (i_pred>i_tek) {
    rekursFunc (array, i_tek, j_tek, i_tek, j_tek- 1);
   }
 
   //Если двигались сверху вниз
   if (i_pred<i_tek) {
    rekursFunc (array, i_tek, j_tek, i_tek, j_tek+ 1);
   }
 
  }
 }
 
 if (poidom_pramo) {
  //Если движение било по горизотали
  if (i_pred== i_tek) {
   //Если движение было слева направо 
   if (j_pred< j_tek) {
    rekursFunc (array, i_tek, j_tek, i_tek, j_tek+ 1);
   }
 
   //Это если справа налево
   else {
    rekursFunc (array, i_tek, j_tek, i_tek, j_tek- 1);
   }
  }
  
  //А это по вертикали
  else {
   //Если движение было снизу вверх
   if (i_pred>i_tek) {
    rekursFunc (array, i_tek, j_tek, i_tek-1, j_tek);
   }
 
   //Cверху вниз
   else {
    rekursFunc (array, i_tek, j_tek, i_tek+ 1, j_tek);
   }
  }
 }
 
 if (poidom_napravo) {
  //Если движение было по горизонтали
  if (i_pred== i_tek) {
   //Если движение было cслева направо
   if (j_pred< j_tek) {
    rekursFunc (array, i_tek, j_tek, i_tek+ 1, j_tek);
   }
 
   //справа налево
   else {
    rekursFunc (array, i_tek, j_tek, i_tek- 1, j_tek);
   }
  }
 
  //А это по вертиикали
  else {
   //Снизу вверх
   if (i_pred>i_tek) {
    rekursFunc (array, i_tek, j_tek, i_tek, j_tek+ 1);
   }
 
   //Сверху вниз
   else {
    rekursFunc (array, i_tek, j_tek, i_tek, j_tek- 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
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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
#include <Windef.h>
 
//Эта будет вызываться всякий раз, когда будет 
//совершён заход в клетку
//эта функция определяет, куда можно из этой клетки идти- налево, прямо или направо
//ИЛИ в несколько напраелений. Назад идти нельзя, так предполагается, что именно оттуда мы и пришли.
//Параметры функции это координаты предыдущей клетк,
//координаты настоящей клетки и адреса трёх переменных типа BOOL
void zahod_v_kletku (char** array, int i_ot, int j_ot, int i_n, int j_n, BOOL* poidom_nalevo, BOOL* poidom_pramo, BOOL* poidom_napravo ) {
 
 //Прежде всего мы должны выяснить, пойдём ли мы мз этой клетки налево,направо или прямо
 //Направление считается по ходу захода в клетку
 
  
 //эТО значит, что мы зашли сюда по горизонтали
 if (i_ot== i_n) {
 
 
 
//++++++++++++++++++++++++++++++++++Здесь мы выясняем, пойдём налево или нет+++++++++++++++++++++++
  //Это знначит, что мы сдвинулись слева направо
  if (j_ot< j_n) {
   if (i_ot) {
     //Идти можно, клетка не скраю. Последнее- выясняем значение клетки, на которую пойдём;
    if (array [i_n- 1] [j_n]== '#') {
     *poidom_nalevo= true;
    } 
   }
  }
 
  //а Это ссправа налево
  else {
   if (i_ot!= M-1) {
    //Идти можно, клетка не скраю. Последнее- выясняем значение клетки, на которую пойдём;
    if (array [i_n+ 1] [j_n]== '#') {
     *poidom_nalevo= true;
    }
   }
  }
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
 
//++++++++++++++++++++++++++++++++++Здесь мы выясняем, пойдём прямо или нет+++++++++++++++++++++++
  //Это знначит, что мы сдвинулись слева направо
  if (j_ot< j_n) {
   if (j_n!= N-1) {
    //Идти можно, клетка не скраю. Последнее- выясняем значение клетки, на которую пойдём;
    if (array [i_n] [j_n+ 1]== '#') {
     *poidom_pramo= true;
    }
   }
  }
 
  //а Это справа налево
  else {
   if (j_n) {
    //Идти можно, клетка не скраю. Последнее- выясняем значение клетки, на которую пойдём;
    if (array [i_n] [j_n- 1]== '#') {
     *poidom_pramo= true;
    }
   }
  }
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
 
//++++++++++++++++++++++++++++++++++Здесь мы выясняем, пойдём мы направо или нет+++++++++++++++++++++++
  //Это знначит, что мы сдвинулись слева направо
  if (j_ot< j_n) {
   if (i_ot!= M-1) {
    //Идти можно, клетка не скраю. Последнее- выясняем значение клетки, на которую пойдём;
    if (array [i_n+ 1] [j_n]== '#') {
     *poidom_napravo= true;
    }
   }
  }
 
  //а Это справа налево
  else {
   if (i_n) {
    //Идти можно, клетка не скраю. Последнее- выясняем значение клетки, на которую пойдём;
    if (array [i_n- 1] [j_n]== '#') {
     *poidom_napravo= true;
    }
   }
  }
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 }
 
 
 //wwwwwwwwwwwwwwwwwwwwwwwwwwwwwа ЭТО значит, что по вертикалиwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
 else {
 
//++++++++++++++++++++++++++++++++++Здесь мы выясняем, пойдём налево или нет+++++++++++++++++++++++
  //Это знначит, что мы сдвинулись снизу вверх
  if (i_ot> i_n) {
   if (j_ot) {
    //Идти можно, клетка не скраю. Последнее- выясняем значение клетки, на которую пойдём;
    if (array [i_n] [j_n- 1]== '#') {
     *poidom_nalevo= true;
    }
   }
  }
 
  //а Это сверху вниз
  else {
   if (j_ot!= N-1) {
    //Идти можно, клетка не скраю. Последнее- выясняем значение клетки, на которую пойдём;
    if (array [i_n] [j_n+ 1]== '#') { 
     *poidom_nalevo= true;
     }
   }
  }
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
 
//++++++++++++++++++++++++++++++++++Здесь мы выясняем, пойдём прямо или нет+++++++++++++++++++++++
  //Это знначит, что мы сдвинулись снизу вверх
  if (i_ot> i_n) {
   if (i_n) {
    //Идти можно, клетка не скраю. Последнее- выясняем значение клетки, на которую пойдём;
    if (array [i_n- 1] [j_n]== '#') {
     *poidom_pramo= true;
    }
   }
  }
 
  //а Это сверху вниз
  else {
   if (i_n!= M-1) {
    //Идти можно, клетка не скраю. Последнее- выясняем значение клетки, на которую пойдём;
    if (array [i_n+ 1] [j_n]== '#') {
     *poidom_pramo= true;
    }
   }
  }
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
 
//++++++++++++++++++++++++++++++++++Здесь мы выясняем, пойдём мы направо или нет+++++++++++++++++++++++
  //Это знначит, что мы сдвинулись снизу вверх
  if (i_ot> i_n) {
   if (j_ot!= N-1) {
     //Идти можно, клетка не скраю. Последнее- выясняем значение клетки, на которую пойдём;
    if (array [i_n] [j_n+ 1]== '#') {
     *poidom_napravo= true;
    }
   }
  }
 
  //а Это сверху вниз
  else {
   if (j_ot) {
     //Идти можно, клетка не скраю. Последнее- выясняем значение клетки, на которую пойдём;
    if (array [i_n] [j_n- 1]== '#') {
     *poidom_napravo= true;
    }
   }
  }
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
      
 }
 
}
 
Текущее время: 02:14. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru