Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
clozer

Нахождение всех возможных путей для спуска с вершины матрицы

04.07.2012, 20:56. Показов 2982. Ответов 3
Метки нет (Все метки)

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

1 2 х х
3 4 5 х
6 7 8 9

высота массива = 3
количество вершин = 2

более удобное графическое представление
___1__2
__3__4__5
6__7__8__9

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

т.е. валиден путь [0, 0, 0] для значений 1, 3 и 6. но не валиден [0, 0, 2] для веришин 1, 3 и 8

нужно получить значения типа:
[0, 0, 0]
[0, 0, 1]
[0, 1, 1]
[0, 1, 2]
[1, 1, 1]
...

помогите с алгоритмом. на крайний случай сойдет и вариант полного перебора, типа:
[0, 0, 0]
[0, 0, 1]
[0, 0, 2]
[0, 1, 0]
[0, 1, 1]
....
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.07.2012, 20:56
Ответы с готовыми решениями:

Нахождение всех возможных путей
дана матрица, нужно с 1,1(Start) обоити всеми возможными путями к А,А(Finish). здвигаться можно так если находимся в (х,у) : (х+1,у);...

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

Поиск всех возможных путей в графе по отдельности
Здравствуйте. Задача такова: Есть граф кодовых пересечений ГКП (3,2,1) (на рисунке). Параметры n - длина кода, k - основание кода, r -...

3
 Аватар для Thirteen
32 / 32 / 8
Регистрация: 04.07.2012
Сообщений: 50
05.07.2012, 02:50
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
#include <iostream>
#define SIZE 4
 
using namespace std;
 
void Search(int [SIZE][SIZE], int, int, int [SIZE]);
int main()
{
    int Matrix[SIZE][SIZE], String[SIZE];
    for(int i = 0; i < SIZE; i++)
    {
        String[i] = 0;
    }
    Matrix[0][0]=1; Matrix[0][1]=2; Matrix[0][2]=0; Matrix[0][3]=0;
    Matrix[1][0]=3; Matrix[1][1]=4; Matrix[1][2]=5; Matrix[1][3]=0;
    Matrix[2][0]=6; Matrix[2][1]=7; Matrix[2][2]=8; Matrix[2][3]=9;
 
    for(int i = 0; i < SIZE; i++)
    {
        if(Matrix[0][i] != 0)
        {
            String[0] = i;
            Search(Matrix, 0, i, String);
        }
    }
    return 0;
}
 
void Search(int Matrix[4][4], int Row, int Column, int String[4])
{
    //Проверяем элемент слева.
    if(Column - 1 >= 0 && Matrix[Row+1][Column-1]!=0 && Row < SIZE)
    {
        //Если он есть, записываем его в массив String
        String[Row+1] = Column-1;
        //Рекурсивно переходим к левому элементу
        Search(Matrix, Row+1, Column-1, String);
    }
    //Проверяем элемент снизу
    if(Matrix[Row+1][Column]!=0 && Row < SIZE)
    {
        //Если он есть, записываем его в массив String
        String[Row+1] = Column;
        //Рекурсивно переходим к нижнему элементу
        Search(Matrix, Row+1, Column, String);
    }
    //Проверяем элемент справа
    if(Matrix[Row+1][Column+1]!=0 && Row < SIZE)
    {
        //Если он есть, записываем в массив.
        String[Row+1] = Column+1;
        //Рекурсивно переходим к правому элементу
        Search(Matrix, Row+1, Column+1, String);
    }
    //Дошли до конца - выводим.
    if(Row==2)
    {
        String[Row] = Column;
        for(int i = 0; i < SIZE-1; i++)
            cout << String[i];
        cout << endl;
    }
    //Дальше происходит размотка стека вызовов.
}
Алгоритм рекурсивный.
Можно решить как-то более интеллектуально, если ввести структуру с указателями на диагональные элементы. Если интересно, могу написать.
И переход к нижнему элементу наверное лишний... Ну пусть будет. Убрать недолго, если что.
1
clozer
06.07.2012, 00:18
спасибо за ответ. подправил алгоритм под свой код. происходт обращение за пределы массива
текущий код:

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
#include <iostream>
#include <fstream>
#include <cstdio>
#include <string>
#include <stdlib.h>
#include <sstream>
 
using namespace std;
 
void Search(int **, int, int, int *, int);
 
int main()
{
  FILE *in, *out;
  in=fopen("data.in","r");
  int arr_size;
  fscanf(in,"%d",&arr_size);
 
  int** data = new int*[arr_size ];
  for(int i = 0; i < arr_size; i++)
      data[i] = new int[arr_size + 1];
 
  for(i = 0; i < arr_size; i++)
  {
    for(int j = 0; j < arr_size + 1; j++)
    {
      data[i][j] = 0;
    }
  }
 
  for(i=0; i < arr_size; i++)
  {
    for(int j = 0; j < i + 2; j++)
    {
      int number;
      fscanf(in,"%d",&number);
      data[i][j] = number;
    }
  }
 
  int* temp_indexes = new int[arr_size];
 
  for(i = 0; i < arr_size; i++)
  {
    temp_indexes[i] = 0;
  }
 
  for(i = 0; i < arr_size; i++)
  {
    if(data[0][i] != 0)
    {
      temp_indexes[0] = i;
      Search(data, 0, i, temp_indexes, arr_size);
    }
  }
  return 0;
}
 
void Search(int **Matrix, int Row, int Column, int *String, int size)
 
{
  cout << "row " << Row + 1 << endl;
  cout << "column " << Column - 1 << endl;
  if(Column - 1 >= 0 && Matrix[Row+1][Column-1]!=0 && Row < size)
  {
    String[Row+1] = Column-1;
    Search(Matrix, Row+1, Column-1, String, size);
  }
  if(Matrix[Row+1][Column]!=0 && Row < size)
  {
    String[Row+1] = Column;
    Search(Matrix, Row+1, Column, String, size);
  }
  if(Matrix[Row+1][Column+1]!=0 && Row < size)
  {
    String[Row+1] = Column+1;
    Search(Matrix, Row+1, Column+1, String, size);
  }
  if(Row==2)
  {
    String[Row] = Column;
    for(int i = 0; i < size-1; i++)
      cout << String[i];
    cout << endl;
  }
}
data.in:

3
1 2
3 4 5
6 7 8 9

помогите найти ошибку, пожалуйста

Добавлено через 45 минут
заметил свою ошибку. нужно было размер делать на +1 больше.
и вместо
C++
1
if(Row==2)
нужно
C++
1
if(Row==size - 2)
 Аватар для Thirteen
32 / 32 / 8
Регистрация: 04.07.2012
Сообщений: 50
06.07.2012, 00:19
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
#include <iostream>
#include <fstream>
#include <cstdio>
#include <string>
#include <stdlib.h>
#include <sstream>
 
using namespace std;
 
void Search(int **, int, int, int *, int);
 
int main()
{
  FILE *in, *out;
  in=fopen("data.in","r");
  int arr_size;
  fscanf(in,"%d",&arr_size);
 
  int** data = new int*[arr_size ];
  for(int i = 0; i < arr_size; i++)
      data[i] = new int[arr_size + 1];
 
  for(int i = 0; i < arr_size; i++)
  {
    for(int j = 0; j < arr_size + 1; j++)
    {
      data[i][j] = 0;
    }
  }
 
  for(int i=0; i < arr_size; i++)
  {
    for(int j = 0; j < i + 2; j++)
    {
      int number;
      fscanf(in,"%d",&number);
      data[i][j] = number;
    }
  }
 
  int* temp_indexes = new int[arr_size];
 
  for(int i = 0; i < arr_size; i++)
  {
    temp_indexes[i] = 0;
  }
 
for(int i = 0; i < 3; i++)
{
    for(int j = 0; j < 3; j++)
        cout << data[i][j] << ' ';
    cout << endl;
}
 
  for(int i = 0; i < arr_size; i++)
  {
    if(data[0][i] != 0)
    {
      temp_indexes[0] = i;
      Search(data, 0, i, temp_indexes, arr_size);
    }
  }
  return 0;
}
 
void Search(int **Matrix, int Row, int Column, int *String, int size)
 
{
  //cout << "row " << Row + 1 << endl;
  //cout << "column " << Column << endl;
  //cout << "element = " << Matrix[Row][Column] << endl;
  if(Row==2)
  {
    String[Row] = Column;
    for(int i = 0; i < size; i++)
      cout << String[i];
    cout << endl;
      return;
  }
  if(Column - 1 >= 0 && Matrix[Row+1][Column-1]!=0 && Row < size)
  {
    String[Row+1] = Column-1;
    Search(Matrix, Row+1, Column-1, String, size);
  }
  if(Matrix[Row+1][Column]!=0 && Row < size)
  {
    String[Row+1] = Column;
    Search(Matrix, Row+1, Column, String, size);
  }
  if(Matrix[Row+1][Column+1]!=0 && Row < size)
  {
    String[Row+1] = Column+1;
    Search(Matrix, Row+1, Column+1, String, size);
  }
}
Мой косяк. Нужно было поставить проверку на то, что ряд последний, в начало. И явно передавать управление.
А так, видимо происходило обращение к элементу несуществующего ряда, вот и ошибка сегментирования.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.07.2012, 00:19
Помогаю со студенческими работами здесь

Нахождение всех путей ориетированного графа
Есть вектор с ребрами vector&lt; vector&lt;int&gt; &gt; g; Как найти все пути методом поиска в глубину например? Количество вершин, из каких в...

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

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

Каким образом лучше выполнять поиск всех возможных путей в ориентированном графе?
Имеется ориентированный граф. Каждое ребро графа имеет вес (условно обозначу #). Задача - найти все возможные пути из вершины 1 к выходу....

Как сосчитать количество всех возможных путей короля по шахматной доске с клетки а1 на эту же клетку а1
дополнение к сабжу -- при условии, что король при каждом ходе не может вернуться на клетку, с которой он пришёл на текущую


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru