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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.93
jambas92
58 / 57 / 3
Регистрация: 18.11.2010
Сообщений: 315
#1

Рекурсивный обход двумерного массива - C++

25.03.2012, 18:40. Просмотров 2080. Ответов 7
Метки нет (Все метки)

Здравствуйте! Не могу составить алгоритм рекурсивного обхода двумерного массива. Например есть массив:
1 2 2
0 1 1
1 2 2
, выбираем произвольную точку, скажем это [1,1] = 1, то нужно проверить все окружающие его числа, и если они больше чем 0, то увеличить счетчик. Мне нужно алгоритм только для случая, если выбранная тока находится по центру, и у него проверяемых чисел 8. Было бы классно с реализацией на С++.

Добавлено через 4 часа 32 минуты
что та должно быть в этом роде... Как это сделать?

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
#include <iostream>
#include <string>
using namespace std;
 
void foo(int**, int, int);
 
int main()
{
    int n = 1, m = 1;
    int **mas = new int*[3];
    for (int i=0; i<3; i++)
    {
        mas[i] = new int[3];
    }
 
    mas[0][0] = 0; mas[0][1] = 1; mas[0][2] = 0;
    mas[1][0] = 1; mas[1][1] = 1; mas[1][2] = 2;
    mas[2][0] = 1; mas[2][1] = 2; mas[2][2] = 1;
 
    if (mas[n][m] == 1)
    {
        foo(mas, n, m);
    }
    return 0;
}
 
void foo (int**a, int x, int y)
{
    int c=0;
    if (a[x][y] == 1 || a[x][y] == 2)
    {
        c++;
        foo(a, x, y-1);
        foo(a, x, y+1);
        foo(a, x+1, y-1);
        foo(a, x+1, y+1);
        foo(a, x+1, y);
        foo(a, x-1, y);
        foo(a, x-1, y-1);
        foo(a, x-1, y+1);
    }
    else
    {
        
    }
    cout << c << endl;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.03.2012, 18:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Рекурсивный обход двумерного массива (C++):

Обход двумерного массива - C++
Сап, нужна помощь Образовать два одномерных массива путем перезаписи в них элементов из заданного целочисленного двумерного...

Рекурсивный обход директорий - C++
Уважаемые Гуру, требуется ваша помошь. Мне необходимо реализовать рекурсивный обход директорий,начиная с заданной. У меня есть класс с...

Рекурсивный обход каталога - C++
Здравствуйте. Стоит следующая задача. Необходимо выполнить рекурсивный обход директорий находящихся в корневом каталоге. При этом занести...

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

Рекурсивный обход НЕбинарного дерева - C++
Имеется функция, которая рекурсивно обходит одну папку. void GetFileList(LPTSTR sPath, Object* fsParser) { WIN32_FIND_DATA...

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
25.03.2012, 18:48 #2
Цитата Сообщение от jambas92 Посмотреть сообщение
Здравствуйте! Не могу составить алгоритм рекурсивного обхода двумерного массива. Например есть массив:
1 2 2
0 1 1
1 2 2
, выбираем произвольную точку, скажем это [1,1] = 1, то нужно проверить все окружающие его числа, и если они больше чем 0, то увеличить счетчик. Мне нужно алгоритм только для случая, если выбранная тока находится по центру, и у него проверяемых чисел 8. Было бы классно с реализацией на С++.
Обязательно рекурсией? Я б просто 8 соседних ячеек ифом проверил + учесть особые случаи (ячейка возле какого-нибудь края матрицы находится)
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
25.03.2012, 18:48 #3
Цитата Сообщение от jambas92 Посмотреть сообщение
Здравствуйте! Не могу составить алгоритм рекурсивного обхода двумерного массива.
А смысл алгоритма то какой? Что должно подсчитываться то? Или просто лишь бы была рекурсия?
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
25.03.2012, 18:51 #4
C++
1
2
3
4
for (int i=stroka-1;i<stroka+2;i++)
 for (int j=stolbec-1;j<stolbec+2;j++)
  if (a[i][j]>0) count++;
if (a[stroka][stolbec]>0) count--;
jambas92
58 / 57 / 3
Регистрация: 18.11.2010
Сообщений: 315
25.03.2012, 18:55  [ТС] #5
нужно обязательно рекурсией. а то что то может оказаться вариантов 3 или 5 я учту, мне нужна программа которая прошла бы рекурсивно 8 соседних элементов

Добавлено через 1 минуту
Цитата Сообщение от Nekto Посмотреть сообщение
Код C++
1
2
3
4
for (int i=stroka-1;i<stroka+2;i++)
for (int j=stolbec-1;j<stolbec+2;j++)
if (a[i][j]>0) count++;
if (a[stroka][stolbec]>0) count--;
это же не рекурсивно...
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
25.03.2012, 19:09 #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int rek(int **a,int i,int j,int cur_i, int cur_j)
{
 int temp=0;
 if (cur_i<i) {
              if (cur_j<=j) {
                            temp+=rek(a,i,j,cur_i,cur_j+1);
                            }
              else temp+=rek(a,i,j,cur_i-1,cur_j);
              }
 else
 if (cur_i==i) {
               if (cur_j>j) temp+=rek(a,i,j,cur_i-1,cur_j);
               }
 else {
      if (cur_j>=j) temp+=rek(a,i,j,cur_i,cur_j-1);
      else temp+=rek(a,i,j,cur_i-1,cur_j);
      }
 if (a[cur_i,cur_j]>0) temp++;
 return temp;    
}
Добавлено через 56 секунд
вызывать через rek(a,stro4ka,stolbec,stro4ka-1,stolbec-1);
jambas92
58 / 57 / 3
Регистрация: 18.11.2010
Сообщений: 315
25.03.2012, 19:40  [ТС] #7
вот так???

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
#include <iostream>
#include <string>
int rek(int **a,int i,int j,int cur_i, int cur_j);
using namespace std;
int main()
{
    int n = 1, m = 1;
    int **mas = new int*[3];
    for (int i=0; i<3; i++)
    {
        mas[i] = new int[3];
    }
 
    mas[0][0] = 0; mas[0][1] = 1; mas[0][2] = 0;
    mas[1][0] = 1; mas[1][1] = 1; mas[1][2] = 2;
    mas[2][0] = 1; mas[2][1] = 2; mas[2][2] = 1;
 
    rek(mas,n,m,n-1,m-1);
    return 0;
}
int rek(int **a,int i,int j,int cur_i, int cur_j)
{
    int temp=0;
    if (cur_i<i) 
    {
        if (cur_j<=j) 
        {
            temp+=rek(a,i,j,cur_i,cur_j+1);                   
        }
        else 
            temp+=rek(a,i,j,cur_i-1,cur_j);
    }
    else
    if (cur_i==i) 
    {
        if (cur_j>j) temp+=rek(a,i,j,cur_i-1,cur_j);
    }
    else 
    {
        if (cur_j>=j) temp+=rek(a,i,j,cur_i,cur_j-1);
        else 
            temp+=rek(a,i,j,cur_i-1,cur_j);
    }
    if (a[cur_i,cur_j]>0)
        temp++;
    return temp;    
}
Добавлено через 18 минут
просто когда я так запускаю этот код, то у меня прога зависает
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
25.03.2012, 19:51 #8
пара опечаток была
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
#include <iostream>
#include <string>
int rek(int **a,int i,int j,int cur_i, int cur_j);
using namespace std;
int main()
{
        int n = 1, m = 1;
        int **mas = new int*[3];
        for (int i=0; i<3; i++)
        {
                mas[i] = new int[3];
        }
 
        mas[0][0] = 0; mas[0][1] = 1; mas[0][2] = 0;
        mas[1][0] = 1; mas[1][1] = 1; mas[1][2] = 2;
        mas[2][0] = 1; mas[2][1] = 2; mas[2][2] = 1;
 
        rek(mas,n,m,n-1,m-1);
        return 0;
}
int rek(int **a,int i,int j,int cur_i, int cur_j)
{
        int temp=0;
        if (cur_i<i) 
        {
                if (cur_j<=j) 
                {
                        temp+=rek(a,i,j,cur_i,cur_j+1);                   
                }
                else 
                        temp+=rek(a,i,j,cur_i+1,cur_j);
        }
        else
        if (cur_i==i) 
        {
                if (cur_j>j) temp+=rek(a,i,j,cur_i+1,cur_j);
        }
        else 
        {
                if (cur_j>=j) temp+=rek(a,i,j,cur_i,cur_j-1);
                else 
                        temp+=rek(a,i,j,cur_i-1,cur_j);
        }
        if (a[cur_i][cur_j]>0)
                temp++;
        return temp;    
}
Так отрабатывает.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.03.2012, 19:51
Привет! Вот еще темы с ответами:

Рекурсивный обход роботом плоской фигуры - C++
Всем доброго времени суток. Помогите, пожалуйста, в решении задачи на рекурсию. Необходимо, чтобы пользователь нарисовал какую-либо...

Рекурсивный обход дерева папок и файлов - избавиться от бесконечного цикла - C++
Добрый день! Стоит задача рекурсивно обойти и сохранить имена папок и файлов в виде вектора. Моя рекурсивная функция работает не...

предлагаю людям класс "рекурсивный обход матрицы" для решения задач на такую тематику - C++
Друзья! Ввиду возникшей необходимости мной был написан класс &quot;рекурсивный обход матрицы&quot;; Теперь задачи на такую тематику будут решаться...

Функции двумерного массива. Транспонировать матрицу через ввод вывод функции двумерного массива. - C++
Транспонировать матрицу через ввод вывод функции двумерного массива.Сначала вывести ее,а потом провести транспонирование.


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
25.03.2012, 19:51
Ответ Создать тему
Опции темы

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