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

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

Войти
Регистрация
Восстановить пароль
 
 
Lonter
1 / 1 / 0
Регистрация: 22.04.2013
Сообщений: 45
#1

Обход матрицы по 0 с заданного элемента - C++

23.04.2013, 11:18. Просмотров 831. Ответов 26
Метки нет (Все метки)

Дана квадратная матрица, состоящая из 0 и 1...делается обход начинаю с какого то элемента... пробегается по 0, например вправо, если встречается 1, то мы меняем маршрут, вниз или вверх, если опять встречается 1, то опять меняем маршрут.....требуется написать программу, которая напишет номер элемента, который сможет пройтись таким образом по всем нулям....реализовать поиск с помощью рекурсивной функции...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.04.2013, 11:18
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Обход матрицы по 0 с заданного элемента (C++):

Функция нахождения минимального элемента заданного столбца матрицы - C++
Написать библиотеку функций для работы с квадратной целочисленной матрицей а)Функция для инициализации массива случайными числами из...

Вставка элемента в заданную позицию, удаление элемента по заданной позиции, поиск заданного элемента - C++
Добавить в класс "Односвязный список" следующие функции: вставка элемента в заданную позицию, удаление элемента по заданной позиции, поиск...

В пользовательском классе List (список) реализовать вставку элемента после заданного элемента - C++
Помогите пожалуйста, мне надо сделать вставку элемента после найденного, а у меня элемент добавляется на место первого элемента. ...

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

Обход матрицы - C++
есть двумерная матрица 4х4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 ее рандомно перемешиваем. потом берем...

Обход матрицы - C++
Нужно составить программу ввода квадратной матрицы и печати в строку всех ее элементов в данном порядке обхода: 7 13 14 16 6 8 12 15 ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Lonter
1 / 1 / 0
Регистрация: 22.04.2013
Сообщений: 45
23.04.2013, 17:03  [ТС] #16
Я здесь 2 день, не знаю как)
chizz
980 / 494 / 54
Регистрация: 19.03.2013
Сообщений: 3,087
Записей в блоге: 18
Завершенные тесты: 1
23.04.2013, 17:06 #17
Цитата Сообщение от Lonter Посмотреть сообщение
Я здесь 2 день, не знаю как)
http://www.cyberforum.ru/about-forum/thread103521.html

Вот тут:
Миниатюры
Обход матрицы по 0 с заданного элемента  
Lonter
1 / 1 / 0
Регистрация: 22.04.2013
Сообщений: 45
23.04.2013, 17:10  [ТС] #18
согласен, забыл что char должны быть указателями....

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
#include <cstdlib>
#include <iostream>
 
using namespace std;
static string path;
 
 
int M[3][3] = {{0,1,0}, {0,0,1}, {0,0,1}};
 
 
char getpath(char* path, int j, int i, char* last, int cnt) {
       
     
   if (cnt>6) return path;    
    
    if (last!="left")      
    if (j+1==3) ;
       else if (M[j+1][i] == 1) ;
        else getpath(path+" right",j+1,i,"right",cnt+1);
       
    if (last!="right")       
    if (j-1==-1) ;
       else if (M[j-1][i] == 1) ;
        else getpath(path+" left",j-1,i,"left",cnt+1);
        
    if (last!="down")       
    if (i-1==-1) ;
       else if (M[j][i-1] == 1) ;
        else getpath(path+" up",j,i-1,"up",cnt+1);  
        
    if (last!="up")       
    if (i+1==3) ;
       else if (M[j][i+1] == 1) ;
        else getpath(path+" down",j,i+1,"down",cnt+1);          
         
         
         if (path!="Element:")
         cout << path  << endl; 
        
         return path;
       
       }
 
int main(int argc, char *argv[])
{  
 
 
 
    for (int i=0;i<3;i++)
    {
        cout << endl;
        for (int j=0; j<3; j++)
        cout << M[j][i] ;
    }
  
    cout << endl;
  
    for (int i=0;i<3;i++)
        for (int j=0; j<3; j++)
        {
            path+="Element:"; 
            cout<<j<<" "<<i<<endl;
            getpath(path, j,i,"first",0);
      
    
            
            path = ""; 
                  
        }
                 
    
}
Ошибка 1 error C2446: !=: нет преобразования "const char *" в "int" c:\users\1\documents\visual studio 2010\projects\defense\defense\gfd.cpp 16
Ошибка 2 error C2040: !=: "int" отличается по уровням косвенного обращения от "const char [5]" c:\users\1\documents\visual studio 2010\projects\defense\defense\gfd.cpp 16
Ошибка 3 error C2664: getpath: невозможно преобразовать параметр 1 из "const char [7]" в "char" c:\users\1\documents\visual studio 2010\projects\defense\defense\gfd.cpp 19
Ошибка 4 error C2446: !=: нет преобразования "const char *" в "int" c:\users\1\documents\visual studio 2010\projects\defense\defense\gfd.cpp 21
Ошибка 5 error C2040: !=: "int" отличается по уровням косвенного обращения от "const char [6]" c:\users\1\documents\visual studio 2010\projects\defense\defense\gfd.cpp 21
Ошибка 6 error C2664: getpath: невозможно преобразовать параметр 1 из "const char [6]" в "char" c:\users\1\documents\visual studio 2010\projects\defense\defense\gfd.cpp 24
Ошибка 7 error C2446: !=: нет преобразования "const char *" в "int" c:\users\1\documents\visual studio 2010\projects\defense\defense\gfd.cpp 26
Ошибка 8 error C2040: !=: "int" отличается по уровням косвенного обращения от "const char [5]" c:\users\1\documents\visual studio 2010\projects\defense\defense\gfd.cpp 26
Ошибка 9 error C2664: getpath: невозможно преобразовать параметр 1 из "const char [4]" в "char" c:\users\1\documents\visual studio 2010\projects\defense\defense\gfd.cpp 29
Ошибка 10 error C2446: !=: нет преобразования "const char *" в "int" c:\users\1\documents\visual studio 2010\projects\defense\defense\gfd.cpp 31
Ошибка 11 error C2040: !=: "int" отличается по уровням косвенного обращения от "const char [3]" c:\users\1\documents\visual studio 2010\projects\defense\defense\gfd.cpp 31
Ошибка 12 error C2664: getpath: невозможно преобразовать параметр 1 из "const char [6]" в "char" c:\users\1\documents\visual studio 2010\projects\defense\defense\gfd.cpp 34
Ошибка 13 error C2446: !=: нет преобразования "const char *" в "int" c:\users\1\documents\visual studio 2010\projects\defense\defense\gfd.cpp 37
Ошибка 14 error C2040: !=: "int" отличается по уровням косвенного обращения от "const char [9]" c:\users\1\documents\visual studio 2010\projects\defense\defense\gfd.cpp 37
Ошибка 15 error C2664: getpath: невозможно преобразовать параметр 1 из "std::string" в "char" c:\users\1\documents\visual studio 2010\projects\defense\defense\gfd.cpp 63
16 IntelliSense: тип возвращаемого значения не соответствует типу функции c:\users\1\documents\visual studio 2010\projects\defense\defense\gfd.cpp 14
17 IntelliSense: выражение должно иметь целочисленный или перечисляемый тип c:\users\1\documents\visual studio 2010\projects\defense\defense\gfd.cpp 19
18 IntelliSense: выражение должно иметь целочисленный или перечисляемый тип c:\users\1\documents\visual studio 2010\projects\defense\defense\gfd.cpp 24
19 IntelliSense: выражение должно иметь целочисленный или перечисляемый тип c:\users\1\documents\visual studio 2010\projects\defense\defense\gfd.cpp 29
20 IntelliSense: выражение должно иметь целочисленный или перечисляемый тип c:\users\1\documents\visual studio 2010\projects\defense\defense\gfd.cpp 34
21 IntelliSense: тип возвращаемого значения не соответствует типу функции c:\users\1\documents\visual studio 2010\projects\defense\defense\gfd.cpp 40
22 IntelliSense: не существует подходящей функции преобразования из "std::string" в "char *" c:\users\1\documents\visual studio 2010\projects\defense\defense\gfd.cpp 63



вот что теперь выводит...
chizz
980 / 494 / 54
Регистрация: 19.03.2013
Сообщений: 3,087
Записей в блоге: 18
Завершенные тесты: 1
23.04.2013, 17:11 #19
Цитата Сообщение от Lonter Посмотреть сообщение
static string path;
Объявите как char. Только правильно как-нибудь
Lonter
1 / 1 / 0
Регистрация: 22.04.2013
Сообщений: 45
23.04.2013, 17:17  [ТС] #20
все равно некоторые остались( их прибавилось чутка(

Добавлено через 2 минуты
Я кстати забыл пояснить что не для всех элементов будет путь...и по нулям 2 раза проходиться нельзя, вот
chizz
980 / 494 / 54
Регистрация: 19.03.2013
Сообщений: 3,087
Записей в блоге: 18
Завершенные тесты: 1
23.04.2013, 17:33 #21
Цитата Сообщение от Lonter Посмотреть сообщение
getpath(path+" right",j+1,i,"right",cnt+1);
Необходимо правильно передать char в первый и четвертый параметр функции getpath.

Добавлено через 55 секунд
Цитата Сообщение от Lonter Посмотреть сообщение
и по нулям 2 раза проходиться нельзя, вот
это очень даже существенно. тут надо думать

Добавлено через 13 минут
Вот вам код, который компилится. Но он падает при запуске. В VS2010 есть отладчик. Прогоните его в отладчике, посмотрите что с ним не так.

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
#include <cstdlib>
#include <iostream>
 
using namespace std;
static string path;
char* msPath = new char[100];
char* msLast = new char[100];
 
 
 
int M[3][3] = {{0,1,0}, {0,0,1}, {0,0,1}};
 
 
char* getpath(char *path, int j, int i, char *last, int cnt) {
     
     
   if (cnt>6) return path;    
    
    if (last!="left")      
    if (j+1==3) ;
       else if (M[j+1][i] == 1) ;
        else getpath(strcat(path,"right"),j+1,i,"right",cnt+1);
       
    if (last!="right")       
    if (j-1==-1) ;
       else if (M[j-1][i] == 1) ;
        else getpath(strcat(path,"left"),j-1,i,"left",cnt+1);
        
    if (last!="down")       
    if (i-1==-1) ;
       else if (M[j][i-1] == 1) ;
        else getpath(strcat(path,"up"),j,i-1,"up",cnt+1);  
        
    if (last!="up")       
    if (i+1==3) ;
       else if (M[j][i+1] == 1) ;
        else getpath(strcat(path,"down"),j,i+1,"down",cnt+1);          
         
         
         if (path!="Element:")
         cout << path  << endl; 
        
         return path;
       
       }
 
int main(int argc, char *argv[])
{  
 
//ji
 
for (int i=0;i<3;i++)
{
 cout << endl;
 for (int j=0; j<3; j++)
  cout << M[j][i] ;
}
  
   cout << endl;
  
for (int i=0;i<3;i++)
 for (int j=0; j<3; j++)
  {
        msPath="Element:"; 
        cout<<j<<" "<<i<<endl;
        getpath(msPath, j,i,"first",0);
      
    
        //  cout<< path << endl;
          path = ""; 
                  
          }
                 
  
}
Lonter
1 / 1 / 0
Регистрация: 22.04.2013
Сообщений: 45
23.04.2013, 17:41  [ТС] #22
так а что все таки делать с тем, что нельзя по нулям ходить?

Добавлено через 2 минуты
else getpath(strcat(path,"right"),j+1,i,"right",cnt+1);

в этой строке ошибка)
chizz
980 / 494 / 54
Регистрация: 19.03.2013
Сообщений: 3,087
Записей в блоге: 18
Завершенные тесты: 1
23.04.2013, 18:06 #23
Цитата Сообщение от Lonter Посмотреть сообщение
в этой строке ошибка)
Какая?

Добавлено через 2 минуты
Цитата Сообщение от Lonter Посмотреть сообщение
так а что все таки делать с тем, что нельзя по нулям ходить?
Отмечать пройденные. Делать массив M1, в котором заполнять единичками ячейки, по которым прошли. После возврата Path обнулять массив M1. Интересно, что получится..

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

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 <cstdlib>
#include <iostream>
 
using namespace std;
 
int M[3][3] = {{0,1,0}, {0,0,1}, {0,0,1}};
int getpath(char *path, int j, int i, char *last, int cnt) {
        
   if (cnt>6) return 0;    
    
    if (last!="left")      
    if (j+1==3) ;
       else if (M[j+1][i] == 1) ;
        else getpath(strcat(path,"right"),j+1,i,"right",cnt+1);
       
    if (last!="right")       
    if (j-1==-1) ;
       else if (M[j-1][i] == 1) ;
        else getpath(strcat(path,"left"),j-1,i,"left",cnt+1);
        
    if (last!="down")       
    if (i-1==-1) ;
       else if (M[j][i-1] == 1) ;
        else getpath(strcat(path,"up"),j,i-1,"up",cnt+1);  
        
    if (last!="up")       
    if (i+1==3) ;
       else if (M[j][i+1] == 1) ;
        else getpath(strcat(path,"down"),j,i+1,"down",cnt+1);          
         
         
         if (path!="Element:")
         cout << path  << endl; 
        
        return 0;
        
       
       }
 
int main(int argc, char *argv[])
{  
 
//ji
 
char msPath[100] = "";
char msLast[100] = "";
 
 
for (int i=0;i<3;i++)
{
 cout << endl;
 for (int j=0; j<3; j++)
  cout << M[j][i] ;
}
  
   cout << endl;
  
for (int i=0;i<3;i++)
 for (int j=0; j<3; j++)
  {
  //      msPath="Element:"; 
        strcpy(msPath,"Element:");
        cout<<j<<" "<<i<<endl;
        getpath(msPath, j,i,"first",0);
      
    
        //  cout<< path << endl;
         strcpy(msPath,""); 
                  
          }
                 
    system("PAUSE");
    return EXIT_SUCCESS;
}
Lonter
1 / 1 / 0
Регистрация: 22.04.2013
Сообщений: 45
23.04.2013, 18:41  [ТС] #24
Stack around the variable 'msPath' was corrupted


вот такая ошибка(

но зато выводит что-то(((

Добавлено через 15 секунд
много сильно
chizz
980 / 494 / 54
Регистрация: 19.03.2013
Сообщений: 3,087
Записей в блоге: 18
Завершенные тесты: 1
23.04.2013, 20:15 #25
Цитата Сообщение от Lonter Посмотреть сообщение
Stack around the variable 'msPath' was corrupted
В ходе рекурсии вылазит за пределы массива. Надо массив побольше объявить.

Цитата Сообщение от Lonter Посмотреть сообщение
много сильно
сейчас выводит все шаги. Для вывода надо условие ставить. Типо когда прошли все клетки, тогда выводить путь.
Плюс проверку на пройденные клетки.

Короче дальше сами разбирайтесь. Удачи.
Lonter
1 / 1 / 0
Регистрация: 22.04.2013
Сообщений: 45
23.04.2013, 20:17  [ТС] #26
Ой ну я постараюсь))) эм, а динамический не стоит делать??
chizz
980 / 494 / 54
Регистрация: 19.03.2013
Сообщений: 3,087
Записей в блоге: 18
Завершенные тесты: 1
23.04.2013, 20:24 #27
Цитата Сообщение от Lonter Посмотреть сообщение
эм, а динамический не стоит делать??
Было бы гуд конечно. Если сможете, то отлично
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.04.2013, 20:24
Привет! Вот еще темы с ответами:

Обход матрицы по спирали - C++
Пожалуйста, подскажите как должен выглядеть листинг к такой программе!? Обойти по спирали, начиная с центра, все элементы квадратной...

Вывести на экран все элементы заданного столбца матрицы большие заданного числа - C++
помогите пожалуйста,завтра последний день( 1)Дан двумерный массив. Вывести на экран все элементы s-го столбца массива, больше k.

Выполнить обход матрицы по спирали - C++
Здійснити обхід матриці по спіралі за годинниковою стрілкою, починаючи від ЇЇ лівого верхнього кута. Вивести елементи матриці у порядку...

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


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

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

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