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

предлагаю людям класс "рекурсивный обход матрицы" для решения задач на такую тематику - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 51, средняя оценка - 4.78
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
29.07.2011, 21:59     предлагаю людям класс "рекурсивный обход матрицы" для решения задач на такую тематику #1
Друзья!
Ввиду возникшей необходимости мной был написан класс "рекурсивный обход матрицы"; Теперь задачи на такую тематику будут решаться легко и просто. С меня интерфейс, с вас- мозги.

подробнее
Рассмотрим одну из таких задач, на её примере я покажу как надо решать такие задачи и познакомлю с терминами. Вот ей текст

....................................................................................
1 Попытка к бегству

Время на тест - 3 секунды.


Узник пытается бежать из замка, который состоит из MN квадратных комнат, расположенных в виде прямоугольника M?N. Между любыми двумя соседними комнатами есть дверь , однако некоторые комнаты закрыты и попасть в них нельзя. В начале узник находится в угловой комнате и для спасения ему надо попасть в противоположную угловую комнату. Времени у него немного, всего он может побывать не более, чем в M+N-1 комнате, включая начальную и конечную комнату на своем пути, то есть с каждым переходом в соседнюю комнату расстояние до выхода из замка должно уменьшаться. От вас требуется найти количество различных маршрутов, ведущих к спасению.
Формат входных данных

Первая строчка входных данных содержит натуральные числа M и N, не превосходящих 1000. Далее идет план замка в виде M строчек из N символов в каждой. Один символ соответствует одной комнате: если символ равен 1, то в комнату можно попасть, если он равен 0, то комната закрыта. Первоначальное положение узника - левый нижний угол (первый символ последней строки), выход находится в правом верхнем углу (последний символ первой строки, оба этих символа равны 1).
Формат выходных данных

Программа должна напечатать количество маршрутов, ведущих узника к выходу и проходящих через M+N-1 комнату, или слово impossible, если таких маршрутов не существует.

Входные данные подобраны таким образом, что искомое число маршрутов не превосходит 2.000.000.000.
Пример

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

3 5
11111
10101
11111

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

3

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

3 5
11101
10101
10101

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

impossible
...................................................................................

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

...Кстати, вот эти цепочки:
(4 0) (3 0) (2 0) (1 0) (0 0) (0 1) (0 2) (0 3) (0 4)
(4 0) (3 0) (2 0) (2 1) (2 2) (1 2) (0 2) (0 3) (0 4)
(4 0) (3 0) (2 0) (2 1) (2 2) (2 3) (2 4) (1 4) (0 4)
(4 0) (4 1) (4 2) (3 2) (2 2) (1 2) (0 2) (0 3) (0 4)
(4 0) (4 1) (4 2) (3 2) (2 2) (2 3) (2 4) (1 4) (0 4)
(4 0) (4 1) (4 2) (4 3) (4 4) (3 4) (2 4) (1 4) (0 4)

....................................................................................

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

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int M, N;
 M= N= 5;
 
 
 //Массив 
 int** array_osn= new int* [M] ;
 
 //ВЫделили память под него и заполнили
 for (int i= 0; i< M; i++) {
  array_osn[i]= new int[N];
 }
 for (int i= 0; i< M; i++) {
  for (int j= 0; j< N; j++) {
   array_osn [i] [j]= 1;
  }
 }
  array_osn [1] [3]= array_osn [3] [3]= array_osn [3] [1]= array_osn [1] [1]= 0 ;
 
 
 rek_obhod_matr<int> obhod (array_osn, M, N, 4, 0/*и это не все параметры*/)
Пока всё просто. А теперь пошли трудности. Плюсом к перечисленным параметрам в конструктор вы передаёте три СОБСТВЕННЫХ функции.

А взамен получаете вектор векторов пар элементов типа int, каждая пара- координаты очередной точки. Ну то есть вот такую штуку получаете:
C++
1
vector <vector <pair<int, int> > > puti;
(Кстати, размер этого ветора и будет количенство путей, в нашем случае 6, угу?)

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Сосредоточимся на функциях- членах класса
Смотрите. Если мы "стоим" в некоторой клетке, объект, созданный нами называется obhod, то её координаты текущие. Их можно найти с помощью функций-членов:

C++
1
2
int obhod.get_i_tek(); 
int obhod.get_j_tek();
\\\\\\\\\\\\\\\\

Вернёмся к задаче. Представьте себе, что мы каким-то образом (пока неважно, каким, объяснение позже) "добрались" до клетки, например (1, 0) и стоим в ней. Вопрос: какой путь мы прошли? Правильно, вот он: (4, 0) (3, 0) (2, 0)

И возвращается он такой функцией- членом:
C++
1
vector< pair<int, int> > set_chto_proshli ();
...А если мы будем стоять, например в точке (2, 2), то вернётся путь
(4, 0)(3, 0)(2, 0)(2, 1) или (4, 0) (4, 1) (4, 2) (3, 2)

Внимание! Координаты текущей клетки в пройденныё путь не входят!

\\\\\\\\\\\\\\\\

Ещё один вектор, который может нам пригодиться- вектор точек, куда мы можем пойти. Допустим, мы стоим в точке (2, 0). Можем пойти в две точки: (1, 0) или (2, 1)
Вектор этих пар вернёт нам функция-член
C++
1
vector< pair<int, int> > get_kuda_poidom ();
\\\\\\\\\\\\\\\\

Ещё две полезных функции-члена могут нам пригодиться:
Преобразования типа, эта херь позволит перегрузить оператор [][]
Это я сам придумал подачи ребят
C++
1
operator T**() {return matrix;};
Так, а эта функция просто возвращает результат
Это возвращает вектор найденнных путей клеток
C++
1
vector <vector <pair<int, int> > > set_puti () {return puti;}
Ну можно ещё что-нибудь будет добавить при необходимости. Например, возврат количества столбцов, кому охота уж

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

А теперь сосредоточимся на авторских функциях.

111111111111111

Первая функция-предикат, вот её прототип:
C++
1
2
template <class T>
bool _poisk_kletok_ (rek_obhod_matr<int>* source, int i_pot, int j_pot);
Она принимает указатель на объект и координаты точки, куда ПОТЕНЦИАЛЬНО можно шагнуть или прыгнуть, кому как охота. Наша задача в этой функции решить подходит ли эта точка для прыжка или нет. Понятное дело, что точка для прыжка должна располагаться рядом с текущей, да не просто рядом а справа или сверху. То есть так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
template <class T>
bool _poisk_kletok_ (rek_obhod_matr<int>* source, int i_pot, int j_pot) {
 
 //Это вот потенциальная точка справа расположена
 if((i_pot== (*source).get_i_tek())&&(j_pot== ((*source).get_j_tek()+ 1)))
  //Тут щас будет код 
 
 //А эта сверху
 if((j_pot== (*source).get_j_tek())&&(i_pot== ((*source).get_i_tek()- 1)))
  //Тоже щас будет код
 
}
ОК, кроме того в клетке с координатами (i_pot, j_pot) должна быть единица

C++
1
2
3
4
5
6
7
8
9
10
11
template <class T>
bool _poisk_kletok_ (rek_obhod_matr<int>* source, int i_pot, int j_pot) {
  if((i_pot== (*source).get_i_tek())&&(j_pot== ((*source).get_j_tek()+ 1)))
  if ((*source)[i_pot][j_pot]== 1) {  
   return true;
  }
 if((j_pot== (*source).get_j_tek())&&(i_pot== ((*source).get_i_tek()- 1)))
  if ((*source)[i_pot][j_pot]== 1)  
   return true;
 return false;
}
Вот мы и написали первую функцию предикат

222222222222222222222

Вторая функция-предикат. Необходима для того, чтобы определить- очередной путь закончился или нет? А применительно к нашей задаче- создана ли ЛЮБАЯ из цепочек путей?
Прототип у неё попроще будет, принимает просо указатель на объект

C++
1
2
template <class T>
bool mozhno_pribavlat_put_ili_net (rek_obhod_matr<int>* source);
Внимание! Путь считается пройденным, если мы "стоим" в некоторой клетке, и она- конец пути.
!!!Помним, что она пока ещё не занесена в пройденный путь!

C++
1
2
3
4
5
6
7
template <class T>
bool mozhno_pribavlat_put_ili_net (rek_obhod_matr<int>* source) {
 //Тут всё просто. Если текущие координаты 0, 4 значит мы в конце пути
 if (!(*source).get_i_tek() && (*source).get_j_tek()== 4) 
  return true; 
 return false;            
}
По-моему ничё сложного

3333333333333333333333333

А третья функция изменения. Она нужна для изменения содержания клетки. В данном примере она совсем не нужна. Так как содержимое клеток мы не меняем. Но ниже я приведу пример, когда она нужна. Прототип:
C++
1
2
template <class T>
void izmenenia (rek_obhod_matr<int>* source);
Вот и всё. Теперь скомпонуем всю эту херь в один код. И да, вот окончательный
вариант прототипа конструктора
C++
1
2
3
4
5
6
7
8
9
//Конструктор, принимает такие парамеры: указатель на матрицу,
  //количество строк, количество столбцов
  //начало (строку, столбец)
  //Функцию-предикат отвечающую за то, на какую точку будет совершён переход (прыжок)
  //Функцию- предикат, определяющую, найден ли очередной путь или нет
  //и функцию, меняющую (или не меняющую) матрицу
  rek_obhod_matr(T**, int, int,int, int,  bool(*)(rek_obhod_matr<int>* source, int, int),\
                 bool (*) (rek_obhod_matr<int>* source),\
                 void (*)(rek_obhod_matr<int>* source));
А вот весь код будет таким, вывод прилагается
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
#include <iostream>
#include <windows.h>
using namespace std;
 
 
#include "rek_obhod_matr.h" 
 
 
 
 
//Первая авторская функция-предикат
template <class T>
bool _poisk_kletok_ (rek_obhod_matr<int>* source, int i_pot, int j_pot) {
 if((i_pot== (*source).get_i_tek())&&(j_pot== ((*source).get_j_tek()+ 1)))
  if ((*source)[i_pot][j_pot]== 1) {  
   return true;
  }
 if((j_pot== (*source).get_j_tek())&&(i_pot== ((*source).get_i_tek()- 1)))
  if ((*source)[i_pot][j_pot]== 1)  
   return true;
 return false;
}
 
//Вторая авторская функция-предикат
template <class T>
bool mozhno_pribavlat_put_ili_net (rek_obhod_matr<int>* source) {
 if (!(*source).get_i_tek() && (*source).get_j_tek()== 4) 
  return true; 
 return false;            
}
 
 
//И третья функция называется
template <class T>
void izmenenia (rek_obhod_matr<int>* source) {}
 
 
 
int main() {
 SetConsoleCP(1251);
 SetConsoleOutputCP(1251);
 
 int M, N;
 M= N= 5;
 
 
 //Массив тот самый
 int** array_osn= new int* [M] ;
 
 for (int i= 0; i< M; i++) {
  array_osn[i]= new int[N];
 }
 for (int i= 0; i< M; i++) {
  for (int j= 0; j< N; j++) {
   array_osn [i] [j]= 1;
  }
 }
 array_osn [1] [3]= array_osn [3] [3]= array_osn [3] [1]= array_osn [1] [1]= 0 ;
 
 
 //ВЫведем его
 printf ("сам массив:\n");
 for (int i= 0; i< M; i++) {
  for (int j= 0; j< N; j++)
   printf ("%d ", array_osn[i][j]);
  printf ("\n");
 };
 
 
 rek_obhod_matr<int> obhod (array_osn, M, N, 4, 0,\
                            _poisk_kletok_<int>,\
                            mozhno_pribavlat_put_ili_net<int>,\
                            izmenenia<int>);
 
 //А здесь мы венули решение
 vector <vector <pair<int, int> > > puti= obhod.set_puti ();
 
 
 
 
 //Тут уже изгаляюсь вывожу пути
 printf ("\nрешение:\n");
 int k= 0;
 for (int i= 0; i< obhod.set_puti().size(); i++) {
  for (int j= 0; j< 9; j++) {
   printf ("(%d %d) ", obhod.set_puti()[i][j].first, obhod.set_puti()[i][j].second);
   if ((!((k+1)%9))&& k) {
    printf ("\n");
   }
   k++;
  }
 }
 
 
 getchar ();
 return 0;
}
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

И чтобы никто не кговорил, что вот я лох, подогнал клас под одну задачу, представляю ещё две задачи, решённые таким же способом.
Итак, знаменитое заполнение матрицы по спирали, стоим в левом нижнем углу, матрица 6X9
(может быть любая). За содержание функций-предикатов не пинайте, кто может сделать проще пусть напишет проще. Комменты опущу. Тут применяется функция изменения, поскольку мы изменяем клетки, заполняя их числами

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
#include <iostream>
#include <windows.h>
using namespace std;
 
 
#include "rek_obhod_matr.h" 
 
 
 
 
 
//Вот эта та самая первая функция, над которой полоьзователю придётся покорпеть.
//Принимает указатель на объект координаты точки на которую якобы надо делать ход
//потенциальные то есть i_pot и j_pot
template <class T>
bool _poisk_kletok_ (rek_obhod_matr<int>* source, int i_pot, int j_pot) {
 //ПОехали условие кропать
 if (!(*source)[i_pot][j_pot]&& !(!i_pot&&!j_pot)) {
 
  //Потенциальая клетка находится над текущей клеткой
  if ((i_pot== (*source).get_i_tek()- 1)&& (j_pot== (*source).get_j_tek())) {
    if (!j_pot) {
     return true;
    }
    else if ((*source)[i_pot+ 1][j_pot- 1]) {
     return true;
    };
  }  
 
  //Потенциальная клетка находится под текущей клеткой
  if ((i_pot== (*source).get_i_tek()+ 1)&& (j_pot== (*source).get_j_tek())) {
   if (j_pot== (9- 1))
    return true;
   else if ((*source)[i_pot][j_pot+ 1]) 
    return true;
  }
  //Потенциальная клетка находтся слева от текущей
  if ((j_pot== (*source).get_j_tek()- 1)&& (i_pot== (*source).get_i_tek())) {
   if (i_pot== (6- 1))
    return true;
   else if ((*source)[i_pot+ 1][j_pot+ 1]) { 
    return true;
   }
 }
  //Потенциальная клетка находтся справа от текущей
  if ((j_pot== (*source).get_j_tek()+ 1)&& (i_pot== (*source).get_i_tek())) {
   if (!i_pot)
    return true;
   else if (((*source)[i_pot- 1][j_pot- 1])||(!(i_pot- 1)&&!(j_pot- 1))) { 
    return true;
   }
  } 
 }
 
 return false;
}
 
//Тут просто
template <class T>
bool mozhno_pribavlat_put_ili_net (rek_obhod_matr<int>* source) {
 if (((*source).set_chto_proshli()).size()== 53) 
  return true; 
 return false;            
}
 
 
//И третья функция называется "izmenenia"
//Если наша задача стоит изменить матрицу (заполнить по спирали элементами и прочая)
//То эта функция должна изменить клетку, которую мы РЕШИЛИ ДОБАВИТЬ В ПУТЬ
//То есть речь идёт о клетке с текущими координатами
template <class T>
void izmenenia (rek_obhod_matr<int>* source) {
 if (!(*source).get_i_tek()&& !(*source).get_j_tek()) 
  (*source)[(*source).get_i_tek()][(*source).get_j_tek()]= 0;
 else {
  (*source)[(*source).get_i_tek()][(*source).get_j_tek()]=\
  (*source)[(*source).set_chto_proshli().back().first][(*source).set_chto_proshli().back().second]+ 1;
 }
}
 
 
 
int main() {
 SetConsoleCP(1251);
 SetConsoleOutputCP(1251);
 
 int M, N;
 M= 6;
 N= 9;
 
 
 //Массив тот самый
 int** array_osn= new int* [M] ;
 
 for (int i= 0; i< M; i++) {
  array_osn[i]= new int[N];
 }
 for (int i= 0; i< M; i++) {
  for (int j= 0; j< N; j++) {
   array_osn [i] [j]= 0;
  }
 }
 
 
 //ВЫведем его
 printf ("Вывод \"заполнение матрицы по спирали\"\n");
 printf ("сам массив:\n");
 for (int i= 0; i< M; i++) {
  for (int j= 0; j< N; j++)
   printf ("%d ", array_osn[i][j]);
  printf ("\n");
 };
 
 rek_obhod_matr<int> obhod (array_osn, M, N, 0, 0,\
                            _poisk_kletok_<int>,\
                            mozhno_pribavlat_put_ili_net<int>,\
                            izmenenia<int>);
 vector <vector <pair<int, int> > > puti= obhod.set_puti ();
 
 vector <pair<int, int> > put= obhod.set_chto_proshli();
 
 printf ("\nрешение:\n");
 int k= 0;
 for (int i= 0; i< put.size(); i++) {
  printf ("(%d %d %d) ", put[i].first, put[i].second, obhod [put[i].first][put[i].second]);
  if ((!((k+1)%9))&& k) {
   printf ("\n");
  }
  k++;
 }
 getchar ();
 return 0;
}
И последняя задача такая: определить все ходы белой шашки.
Значит, у меня белая шашка это единичка, чёрные двойки, остальные ноли. Всё то же самое. Два предиката, пустое изменение, массив, создание объекта и любование результатом.

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
#include <iostream>
#include <windows.h>
using namespace std;
 
 
#include "rek_obhod_matr.h" 
//Это определение ходов белой шашки
 
 
 
 
template <class T>
bool _poisk_kletok_ (rek_obhod_matr<int>* source, int i_pot, int j_pot) {
 
 
 vector< pair<int, int> > chto_proshli= (* source).set_chto_proshli (); 
 pair <int, int> para (i_pot, j_pot);
 vector< pair<int, int> >:: iterator it;
 it= find (chto_proshli.begin(), chto_proshli.end(), para);
 if (it== chto_proshli.end()) {
 
 
 //Срубаем вправо вниз
 if ((((*source).get_i_tek()+ 2)== i_pot)&& (((*source).get_j_tek()+ 2)== j_pot)&&(!(*source)[i_pot][j_pot])&&\
  ((*source)[(*source).get_i_tek()+ 1][(*source).get_j_tek()+ 1]== 2)) {
  if ((*source)[i_pot- 1][j_pot- 1]== 2)
   if ((*source).set_chto_proshli().size()== 2)
    if (abs((*source).set_chto_proshli()[0].first- (*source).set_chto_proshli()[1].first)== 2)
     return true; 
    else return false;
   else return true; 
 }
 //Срубаем влево вниз
 if ((((*source).get_i_tek()+ 2)== i_pot)&& (((*source).get_j_tek()- 2)== j_pot)&&(!(*source)[i_pot][j_pot])&&\
  ((*source)[(*source).get_i_tek()+ 1][(*source).get_j_tek()- 1]== 2)) {
  if ((*source)[i_pot- 1][j_pot+ 1]== 2)
   if ((*source).set_chto_proshli().size()== 2)
    if (abs((*source).set_chto_proshli()[0].first- (*source).set_chto_proshli()[1].first)== 2)
     return true; 
    else return false;
   else return true; 
 } 
 
 //Срубаем влево вверх
 if ((((*source).get_i_tek()- 2)== i_pot)&& (((*source).get_j_tek()- 2)== j_pot)&&(!(*source)[i_pot][j_pot])&&\
  ((*source)[(*source).get_i_tek()- 1][(*source).get_j_tek()- 1]== 2)) {
  if ((*source)[i_pot+ 1][j_pot+ 1]== 2)
   if ((*source).set_chto_proshli().size()== 2)
    if (abs((*source).set_chto_proshli()[0].first- (*source).set_chto_proshli()[1].first)== 2)
     return true; 
    else return false;
   else return true; 
 }
 
 //Срубаем вправо вверх
 if ((((*source).get_i_tek()- 2)== i_pot)&& (((*source).get_j_tek()+ 2)== j_pot)&&(!(*source)[i_pot][j_pot])&&\
  ((*source)[(*source).get_i_tek()- 1][(*source).get_j_tek()+ 1]== 2)) {
  if ((*source)[i_pot+ 1][j_pot- 1]== 2)
   if ((*source).set_chto_proshli().size()== 2)
    if (abs((*source).set_chto_proshli()[0].first- (*source).set_chto_proshli()[1].first)== 2)
     return true; 
    else return false;
   else return true; 
 }  
 
 
 //Ходим влево вверх
 if ((((*source).get_i_tek()- 1)== i_pot)&& (((*source).get_j_tek()- 1)== j_pot) && ((*source)[i_pot][j_pot]== 0)) {
  if (!(*source).set_chto_proshli().size()) {
   return true; 
  }
 }
 //Ходим вправо вверх
 if ((((*source).get_i_tek()- 1)== i_pot)&& (((*source).get_j_tek()+ 1)== j_pot) && ((*source)[i_pot][j_pot]== 0)) {
  if (!(*source).set_chto_proshli().size()) {
   return true; 
  }
 }
} 
 
 return false;
}
 
 
//Эта будет вторая функция, над которой придётся покорпеть
//Ну то есть тупо: завершён очередной обход или нет
template <class T>
bool mozhno_pribavlat_put_ili_net (rek_obhod_matr<int>* source) {
 if(((*source).get_kuda_poidom().size())== 0)
   return true; 
 return false;            
}
 
 
template <class T>
void izmenenia (rek_obhod_matr<int>* source) {}
 
 
 
int main() {
 SetConsoleCP(1251);
 SetConsoleOutputCP(1251);
 
 int M, N;
 M= 8;
 N= 8;
 
 
 //Массив тот самый
 int** array_osn= new int* [M] ;
 
 for (int i= 0; i< M; i++) {
  array_osn[i]= new int[N];
 }
 for (int i= 0; i< M; i++) {
  for (int j= 0; j< N; j++) {
   array_osn [i] [j]= 0;
  }
 }
 
 array_osn [2][1]= array_osn [2][3]=array_osn [4][3]= 2;
 array_osn [5][2]= 1;
 
 //ВЫведем его
 printf ("сам массив:\n");
 for (int i= 0; i< M; i++) {
  for (int j= 0; j< N; j++)
   printf ("%d ", array_osn[i][j]);
  printf ("\n");
 };
 
 
 
 rek_obhod_matr<int> obhod (array_osn, M, N, 5, 2,\
                            _poisk_kletok_<int>,\
                            mozhno_pribavlat_put_ili_net<int>,\
                            izmenenia<int>);
 vector <vector <pair<int, int> > > puti= obhod.set_puti ();
 
 vector <pair<int, int> > put= obhod.set_chto_proshli();
 
 printf ("\nрешение:\n");
 for (int i= 0; i< obhod.set_puti().size(); i++) { 
  for (int j= 0; j< obhod.set_puti()[i].size(); j++)  
   printf ("(%d %d) ", obhod.set_puti()[i][j].first, obhod.set_puti()[i][j].second);
  printf ("\n");
 }
 getchar ();
 return 0;
}

В классе есть недостатки, так я например не уверен, что всегда надо передавать матрицу в него и делать там копию. Но я для надёжности передаю всё же. В общем, правьте, уточняйте тестируйте. Говорите чё не так, буду исправлять. РАспространяется по лицензии GPL
Миниатюры
предлагаю людям класс "рекурсивный обход матрицы" для решения задач на такую тематику   предлагаю людям класс "рекурсивный обход матрицы" для решения задач на такую тематику   предлагаю людям класс "рекурсивный обход матрицы" для решения задач на такую тематику  

Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.07.2011, 21:59     предлагаю людям класс "рекурсивный обход матрицы" для решения задач на такую тематику
Посмотрите здесь:

C++ предлагаю программу людям "альтернативное копирование файлов в проводнике"
C++ предлагаю людям класс "каждому потоку- своё окно" для тестирования многопоточных приложений.
предлагаю людям заголовочный файл с реализацией функций и классов, необходимых для решения задач по комбинаторике C++
C++ Наследуемым классом для комплексного числа объявить класс "радиус-вектор", имеющий данные "длина" и "угол"
Предлагаю людям класс для написания специфических снимков системы C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
30.07.2011, 16:56  [ТС]     предлагаю людям класс "рекурсивный обход матрицы" для решения задач на такую тематику #21
Я не буду ничё искать. Искать будешь ты и писать комменты на русском языке и выкладывать сюда.
Иначе... Хотя чё иначе? На старых дрожжах выедешь. Напишешь чушь и спасибо скажут. Ну, пусть так и будет.

(И кстати, скорость написания программы. ОК, мне что-то подсказывает что мой шаблон
(предикат+предикат+изменения+объявление массива+наблюдение решения) ускоряет что ли скорость написания...)

А я пошёл осваивать MSVC.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,126
Записей в блоге: 26
30.07.2011, 16:56     предлагаю людям класс "рекурсивный обход матрицы" для решения задач на такую тематику #22
Цитата Сообщение от kravam Посмотреть сообщение
РАспространяется по лицензии GPL
Пока оно и забесплатно никому не надо. А кто-то может и согласится его взять, но только при условии, что ты сам доплатишь
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
30.07.2011, 16:59     предлагаю людям класс "рекурсивный обход матрицы" для решения задач на такую тематику #23
Цитата Сообщение от kravam Посмотреть сообщение
Так что термин "рекурсивный обход матрицы" придуман для меня мной.
оК, определились. Тогда давай хотя бы на словах, даже не на псевдокоде, опиши, что это вообще такое. Что под этим подразумевается. Может это действительно откровение, которого всем не хватает!

Ведь если я скажу, что вот у меня класс, который выполняет кразипопу над матрицей, что очень нужно для решения задач связанных с кразипопой, но я не покажу кода, не скажу что он делает и что это за задачи, но кому-то это очень надо. Ах да, термин "кразипопа" я для внутреннего использования придумал...
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,126
Записей в блоге: 26
30.07.2011, 17:00     предлагаю людям класс "рекурсивный обход матрицы" для решения задач на такую тематику #24
Мда... Обидно, когда тратишь время на человека, чтобы показать ему ошибки, а в ответ он только срёт. Ладно, живи сам со своим классом
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
30.07.2011, 17:04  [ТС]     предлагаю людям класс "рекурсивный обход матрицы" для решения задач на такую тематику #25
Цитата Сообщение от Evg Посмотреть сообщение
Если говоришь о задачах во множественном числе, то возьми 3-4 разных задачи и реши их с помощью своего класса.
Цитата Сообщение от kravam Посмотреть сообщение
И чтобы никто не кговорил, что вот я лох, подогнал клас под одну задачу, представляю ещё две задачи, решённые таким же способом.
Ужасно, Evg

Добавлено через 2 минуты
Цитата Сообщение от Dekio Посмотреть сообщение
Но когда критикуют, нужно объективно оценивать ситуацию и думать: "почему плохо критикуют, что надо сделать что бы это исправить?"
Да не, нормально всё. Просто один говорит, что я одну задачу решил, а я решил три. Другой говорит, что класс плох, хотя я код класса не выкладывал.

...А так-то да, очень конструктивная критика.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,126
Записей в блоге: 26
30.07.2011, 17:07     предлагаю людям класс "рекурсивный обход матрицы" для решения задач на такую тематику #26
Цитата Сообщение от kravam Посмотреть сообщение
представляю ещё две задачи, решённые таким же способом
Как уже писал выше, меня заломало читать эту писанину

Добавлено через 2 минуты
Почитал две ещё твои задачи. Моё предложение остаётся в силе. Реши эти задачи без твоего класса и сравни решения
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
30.07.2011, 17:27  [ТС]     предлагаю людям класс "рекурсивный обход матрицы" для решения задач на такую тематику #27
Evg, я между прочим спрашивал в теме про конструктора прочитав ВСЮ твою тему. Мог бы всё не читать, но уж удостовериться, в том, что я именно предложил решение одной задачи. Иу видел бы, что это не так.

Добавлено через 3 минуты
Цитата Сообщение от Evg Посмотреть сообщение
Почитал две ещё твои задачи. Моё предложение остаётся в силе. Реши эти задачи без твоего класса и сравни решения
решал. Между прочим, я все эти заачи решил сперва сермяжным способом. В лоб. И дал чуваку совет в этой теме как их решать. И только щас дорос до класса.

Добавлено через 3 минуты
Цитата Сообщение от Evg Посмотреть сообщение
Мда... Обидно, когда тратишь время на человека, чтобы показать ему ошибки, а в ответ он только срёт. Ладно, живи сам со своим классом
Прикинь, я понимаю недостатки универсального интерфейса. Просто где-то внутрях, интуитивно, понимаю чем он чреват и всё тут. Ну так и достоинства его я тоже мыслю. Если сложная задача, по фиг на память- использовать мой интерфейс. Не хватает стека- забить. Я не строю иллюзий, как видишь.

Добавлено через 5 минут
Цитата Сообщение от Deviaphan Посмотреть сообщение
оК, определились. Тогда давай хотя бы на словах, даже не на псевдокоде, опиши, что это вообще такое. Что под этим подразумевается. Может это действительно откровение, которого всем не хватает!
Вот ёрничать только не надо тут.

Допустим, нужно тебе попасть из точки A матрицы в точку B по определённым правилам. Вот перебираешь точки, которые этим правилам следуют. Причём начиная в каждой новой точке, всё как-бы по-новому воссоздаётся. Допустим, я "стоял" в точке (3, 5) (только не спрашивай меня, что значит термин "стоял"!) и выполнялся какой-то код. И этот код (как-то: поиск точек куда можно "прынуть", проверка- не конец ли пути) повторяется. А раз повторяется, не писать же его для каждой новой точки! Надо писать рекурсивную функцию для этого дела и параметром в неё передавать координаты текущей точки. Вот и всё.

Добавлено через 6 минут
Вот что делается в рекурсивной функции:
1)во первых, ищутся точки куда можно пойти из этой точки
2)Проверка на то, конец пути или нет
3)Если не конец пути, то вызывается функция изменения, потом координаты текущей точки прибавляется к пройденному пути
4)снова вызывается эта функция ДЛЯ КАЖДОЙ ИЗ ТОЧЕК, найденных в пункте 1.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
30.07.2011, 17:45     предлагаю людям класс "рекурсивный обход матрицы" для решения задач на такую тематику #28
Цитата Сообщение от kravam Посмотреть сообщение
Вот что делается в рекурсивной функции:
оК. Если из точки можно идти в несколько сторон, как себя рекурсия ведёт?
Т.е. поиск в глубину или в ширину?

Кстати, если бы та назвал тему "поиск пути в лабиринте" вопросов и нареканий было бы чуть меньше. Но про BGL сказали бы гораздо раньше.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
30.07.2011, 18:22  [ТС]     предлагаю людям класс "рекурсивный обход матрицы" для решения задач на такую тематику #29
Если из точки можно пойти в несколько точек, например в 4 (ход конём из центра доски), то рекурсивная функция вызывается циклом, псевдокод:

C++
1
2
3
4
rek_funktsia () {
 for (int i= 0; i< 4; i++)
  rek_funktsia ();
}
Ньюанс: мной было сказано, что в рекурсивную функцию передаются координаты текущей точки. Это я для понятности сказал. В каждой функции действительно присутствую координаты текущей точки. Но она ГЛОБАЛЬНЫ i_tek, j_tek; они являются полями класса и определяются перед вызовом рекурсивной функции и определяются перед рекурсией. То есть так будет:

C++
1
2
3
4
5
6
rek_funktsia () {
//Тут определяются глобальные переменные  (поля класса) i_tek и j_tek 
//Таким образом в каждой рекурсивной функции свои текущие координаты 
for (int i= 0; i< 4; i++)
  rek_funktsia ();
}
Вопрос: на фига я сделал текущие координаты глобальными, а не передаю их в функцию параметрами, например? Ответ прост: в предикате иногда приходится использовать координаты текущей точки. Для этого они должны быть полями класса и возвращаться функциями:
C++
1
2
3
  //Эти функции возвращают координаты текущей клетки
  int get_i_tek () {return i_tek;}
  int get_j_tek () {return j_tek;}
Вот и всё.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,126
Записей в блоге: 26
30.07.2011, 18:25     предлагаю людям класс "рекурсивный обход матрицы" для решения задач на такую тематику #30
Цитата Сообщение от kravam Посмотреть сообщение
И только щас дорос до класса
И при этом не видишь, что при помощи класса решение получается более громоздким? Может для начала надо было бы найти задачи, которые действительно будет проще решать при помощи твоего класса?

Цитата Сообщение от kravam Посмотреть сообщение
Прикинь, я понимаю недостатки универсального интерфейса. Просто где-то внутрях, интуитивно, понимаю чем он чреват и всё тут. Ну так и достоинства его я тоже мыслю. Если сложная задача, по фиг на память- использовать мой интерфейс. Не хватает стека- забить. Я не строю иллюзий, как видишь
Реальные недостатки ты увидишь тогда, когда начнёшь его использовать в реальных условиях. Три твои задачи - это вовсе не реальные условия, а тестовые, потому как эти задачи проще решать без твоего класса

Цитата Сообщение от kravam Посмотреть сообщение
Допустим, нужно тебе попасть из точки A матрицы в точку B по определённым правилам. Вот перебираешь точки, которые этим правилам следуют. Причём начиная в каждой новой точке, всё как-бы по-новому воссоздаётся. Допустим, я "стоял" в точке (3, 5) (только не спрашивай меня, что значит термин "стоял"!) и выполнялся какой-то код. И этот код (как-то: поиск точек куда можно "прынуть", проверка- не конец ли пути) повторяется. А раз повторяется, не писать же его для каждой новой точки! Надо писать рекурсивную функцию для этого дела и параметром в неё передавать координаты текущей точки. Вот и всё
За это пока браться не стоит, но тем не менее напишу. Матрица с точки зрения поиска пути - есть не что иное, как граф. А потому класс по-хорошему надо писать как класс для решения поиска пути в графе. При этом матрицу реализовать как частный случай графа. здесь я приводил пример решения программы для решения судоку. Решалка строилась максимально абстрактно: есть столько-то клеток, которые объединены в столько-то пересекающихся групп и нужно расставить цифры, чтобы в каждой группе цифры не повторялись. При этом обычная квадратная судоку является частным случаем общей. При таком подходе можно задавать входные данные для судоку любой формы, но для квадратной, как для частного случая, процесс этот становится в разы более простым (потому как квадрат проще описывается, чем произвольный набор). Точно так же матрицу проще описать, чем граф произвольной формы: можно задать ширину и высоту и этой информации достаточно, чтобы класс внутри себя построил граф, который в мысленном представлении выглядел бы как прямоугольник

Цитата Сообщение от kravam Посмотреть сообщение
Вот что делается в рекурсивной функции:
1)во первых, ищутся точки куда можно пойти из этой точки
2)Проверка на то, конец пути или нет
3)Если не конец пути, то вызывается функция изменения, потом координаты текущей точки прибавляется к пройденному пути
4)снова вызывается эта функция ДЛЯ КАЖДОЙ ИЗ ТОЧЕК, найденных в пункте 1.
Вот с этого и надо было начинать. Описать некий класс задач с примерами, описать, что для решения этого класса задач было бы удобно пользоваться понятием "поиск пути в графе (матрице)", описать алгоритм на словах, а потом уже показать код. И поменьше быдлокодства и шапкозакидательства

Добавлено через 31 секунду
И ещё более-меняя внятно описать, как твоим классом пользоваться.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
30.07.2011, 18:39  [ТС]     предлагаю людям класс "рекурсивный обход матрицы" для решения задач на такую тематику #31
Всё дело в том (а может и не всё) что я не вижу практических задач которые можно было бы решить моим классом.
То есть учебных- сколько угодно. Практических не вижу. То есть может они и есть но я их не вижу.
Другое дело, что может кто-то и знает такие задачи, ну так надо их сформулировать и сказать мне. И я решу или не решу. Так ведь не скажут ведь. Может их в природе нет. Ну и ладненько. Написал да написал.

А я начал в надежде что челы оценят интефейс, а потом представить и сам класс. Во схематично как им пользоваться:

Пишем предикат, возвращающий переменную bool в зависимости от того, принадлежит ли некоторая точка пути или нет (точка задаётся координатами)
Пишем предикат, позволяющий определить, является ли некоторая точка ПОСЛЕДНЕЙ в пути или нет (точка задаётся координатами)
Пишем функцию изменяющую или не изменяющую клетки

(Это всё. Остальное сделается САМО)

Объявляем массив, заполняем вручную, объявляем объект класса и СРАЗУ ЖЕ получаем результат

То есть конструктор вызовет чё надо и всё внутри класса закрутится-завертится незаметно для постороннего класса.

===========================================

А графы изучать наверное не буду, я пытался начать но уж слишком сложно, а главное НЕОПРАВДАННО сложно. Столкнусь- тогда и буду, пока обхожусь.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
30.07.2011, 18:39     предлагаю людям класс "рекурсивный обход матрицы" для решения задач на такую тематику #32
Цитата Сообщение от kravam Посмотреть сообщение
Но она ГЛОБАЛЬНЫ i_tek, j_tek;
Одно это наталкивает на твёрдое убеждение о недостаточной проработке интерфейса класса и ошибках в проектировании. Но это лишь повод ещё раз всё переосмыслить и написать лучше!

Цитата Сообщение от kravam Посмотреть сообщение
то рекурсивная функция вызывается циклом, псевдокод
Вот сразу бы и писал, что класс реализует поиск в глубину с заданием правила поиска при помощи пользовательских предикатов. И не нужно никаких своих терминов выдумывать...
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
30.07.2011, 18:44  [ТС]     предлагаю людям класс "рекурсивный обход матрицы" для решения задач на такую тематику #33
Ну извините меня я сам до всего дохожу... Названий вещей не знаю...

Добавлено через 3 минуты
Цитата Сообщение от Deviaphan Посмотреть сообщение
Одно это наталкивает на твёрдое убеждение о недостаточной проработке интерфейса класса и ошибках в проектировании. Но это лишь повод ещё раз всё переосмыслить и написать лучше!
Ну короче есть функция-метод класса и в ней локальные переменные: координаты текущей клетки. Если подскажешь способ как эти переменные вернуть в функцию main буду благодарен. (Если они поля класса (в данном случае поля класса== глобальные переменные), то возвращаются с помощью методов класса же.)
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
30.07.2011, 18:46     предлагаю людям класс "рекурсивный обход матрицы" для решения задач на такую тематику #34
Цитата Сообщение от kravam Посмотреть сообщение
А графы изучать наверное не буду, я пытался начать но уж слишком сложно, а главное НЕОПРАВДАННО сложно. Столкнусь- тогда и буду, пока обхожусь.
Дерево тоже граф. Даже список это граф. Даже одинокий объект можно назвать вырожденным графом.)
Уверяю тебя, это не сложно и очень оправдано.

Добавлено через 1 минуту
Цитата Сообщение от kravam Посмотреть сообщение
в данном случае поля класса== глобальные переменные
Такого равенства не может быть в принципе. Если эти переменные поля класса, то моё замечание не уместно, а ты иди читай про области видимости.)
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
30.07.2011, 18:47  [ТС]     предлагаю людям класс "рекурсивный обход матрицы" для решения задач на такую тематику #35
Кто-то тут говорил о вредности универсализации...
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,126
Записей в блоге: 26
30.07.2011, 18:50     предлагаю людям класс "рекурсивный обход матрицы" для решения задач на такую тематику #36
Цитата Сообщение от kravam Посмотреть сообщение
Всё дело в том (а может и не всё) что я не вижу практических задач которые можно было бы решить моим классом.
То есть учебных- сколько угодно. Практических не вижу. То есть может они и есть но я их не вижу.
Другое дело, что может кто-то и знает такие задачи, ну так надо их сформулировать и сказать мне. И я решу или не решу. Так ведь не скажут ведь. Может их в природе нет. Ну и ладненько. Написал да написал
Под реальными условиями я в том числе понимаю и учебные задачи. Смысл "реального условия" заключается в том, что требуется задача, в которой реально нужно было бы найти путь в матрице. Все три приведённые задачи - это явно выраженные частные случаи, которые годятся только для тестирования класса, но не для использования по необходимости.

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

Если на прямоугольной доске нарисован лабиринт (клетка занята или свободна). Надо найти из него выход (как усложнение - выход по самому короткому пути)

Цитата Сообщение от kravam Посмотреть сообщение
Пишем предикат, возвращающий переменную bool в зависимости от того, принадлежит ли некоторая точка пути или нет (точка задаётся координатами)
Пишем предикат, позволяющий определить, является ли некоторая точка ПОСЛЕДНЕЙ в пути или нет (точка задаётся координатами)
Пишем функцию изменяющую или не изменяющую клетк
Не поленись и найди в инете учебник Ландау и Лифшица по квантовой механике. Прости самую первую главу и засеки, через сколько секунд у тебя сломается моск. А потом посмотри на свои посты глазами тех, кто ничерта не знает про твой класс и прикинь, сможет ли он из твоей писанины что-либо понять (с нуля)

Цитата Сообщение от kravam Посмотреть сообщение
А графы изучать наверное не буду
Потому я и писал, что пока не стОит за это браться. Но как вариант это надо держать в уме, чтобы понимать вообще, что такое универсальный интерфейс и что такое частные случаи этого интерфейса
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
30.07.2011, 18:51  [ТС]     предлагаю людям класс "рекурсивный обход матрицы" для решения задач на такую тематику #37
Цитата Сообщение от Deviaphan Посмотреть сообщение
Такого равенства не может быть в принципе. Если эти переменные поля класса, то моё замечание не уместно, а ты иди читай про области видимости.)
Это условное равенство. В том смысле, что поля класса доступны в каждой функции. А если я прочту про область видимости, что я не раз делал уже, то в сотый раз узнаю о том, что локальные переменные видны только в блоке {}
А мне нужно чтобы их можно было возвращать в main. Сдаётся мне, есть какой-то хитрый способ и ты про него знаешь. Знаешь и молчишь. Ну ничё удивительного. Кто знает тот молчит. Поэтому буду так.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,126
Записей в блоге: 26
30.07.2011, 18:56     предлагаю людям класс "рекурсивный обход матрицы" для решения задач на такую тематику #38
Цитата Сообщение от kravam Посмотреть сообщение
Кто-то тут говорил о вредности универсализации
Если создать интерфейс А, который способен создавать только граф - это реально вредно. Но если ты сделаешь интерйейс Б, который является надстройкой над А и реализует частный случай первого, то таким интерфейсом будут пользоваться. Интерфейс Б менее универсальный, а потому и более удобный. Но в основе РЕАЛИЗАЦИИ интерфейса Б лежит интерфейс А, которым кроме как разработчики интерфейса Б никто и не пользуется. А вот интерфейсом Б пользуется много кто, и им плевать, что интерфейс Б реализован через А.

Если на конкретном примере, то если создать интерфейс "граф", то никто им не будет пользоваться для хранения информации о матрице (код лабиринта, шахматной доски и т.п). Потому что слишком универсальный интерфейс "граф" годен для кодирования матрицы, не удобен для использования матрицы. Теперь ты создал интерфейс "матрица", который внутри себя реализован через "граф". И этим интерфесом будут пользоваться для кодирования лабиринта или шахматной доски, потому что он простой и понятный (при создании надо описать только два параметра и легко понять логику, когда по двум координатам однозначно идентифицируется узел). Интерфейс "матрица" менее универсальный, но будет более используемым
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
30.07.2011, 18:56  [ТС]     предлагаю людям класс "рекурсивный обход матрицы" для решения задач на такую тематику #39
Цитата Сообщение от Evg Посмотреть сообщение
Не поленись и найди в инете учебник Ландау и Лифшица по квантовой механике. Прости самую первую главу и засеки, через сколько секунд у тебя сломается моск. А потом посмотри на свои посты глазами тех, кто ничерта не знает про твой класс и прикинь, сможет ли он из твоей писанины что-либо понять (с нуля)
Тут я согласен. Но что делать? Я умею написать но не умею объяснить. Вся надежда что кто-то зацепится за ключевые слова и будет у меня спрашивать и я объясню пошагово что и как.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.07.2011, 19:00     предлагаю людям класс "рекурсивный обход матрицы" для решения задач на такую тематику
Еще ссылки по теме:

Разница между понятиями "Обход в прямом направлении" и "Итерационный прямой обход" C++
C++ Класс "Графический объект", от которого будут наследоваться классы "круг" и "квадрат"
C++ Описать класс "Контейнер" как объект, предназначенный для транспортировки классов "Строительных блоков"

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

Или воспользуйтесь поиском по форуму:
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,126
Записей в блоге: 26
30.07.2011, 19:00     предлагаю людям класс "рекурсивный обход матрицы" для решения задач на такую тематику #40
Цитата Сообщение от kravam Посмотреть сообщение
Я умею написать но не умею объяснить
ТОгда не берись за реализацию универсальных вещей, которые предлагаешь людям
Yandex
Объявления
30.07.2011, 19:00     предлагаю людям класс "рекурсивный обход матрицы" для решения задач на такую тематику
Ответ Создать тему

Метки
быдлокодерство
Опции темы

Текущее время: 20:53. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru