Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.92/111: Рейтинг темы: голосов - 111, средняя оценка - 4.92
0 / 0 / 0
Регистрация: 29.05.2011
Сообщений: 55
1

найти количество различных маршрутов, ведущих к спасению

17.05.2012, 11:21. Показов 21710. Ответов 27
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Узник пытается бежать из замка, который состоит из 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
10111
Выходные данные
impossible
Помогите решить, пожалуйста, сдавать через два часа...хоть начало...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.05.2012, 11:21
Ответы с готовыми решениями:

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

Вывести кол-во маршрутов, ведущих узника к выходу и проходящих через M+N-1 комнату, или слово impossible, если таких маршрутов не существует
Здравствуйте! Имеем функцию на C++.Помогите исправить ошибки, чтобы выводился правильный результат....

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

Посчитать количество замкнутых маршрутов, проходящий ровно через четыре различных города
Задача E. Тетрациклофобия Имя входного файла: phobia.in Имя выходного файла: phobia.out...

27
670 / 198 / 29
Регистрация: 10.05.2012
Сообщений: 595
17.05.2012, 11:22 2
решить всё за вас? наверное с олимпиады пишете
0
0 / 0 / 0
Регистрация: 29.05.2011
Сообщений: 55
17.05.2012, 12:09  [ТС] 3
Я же не 5 задач написала вам решить, а хотя бы какие-нибудь мысли

Добавлено через 23 минуты
как думаете начать?
0
Higher
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
17.05.2012, 12:11 4
Динамикой:
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
#include <iostream>
#include <vector>
 
int main()
{
    int n, m;
    std::cin >> n >> m;
    
    std::vector< std::vector< int > > matrix(n, std::vector< int > (m) );
    matrix[0][0] = 1;
    
    for (int i = 0; i < n; ++i)
    {
        for (int j = 0; j < m; ++j)
        {
            int x;
            std::cin >> x;
            if ( x != 0 )
            {
                if ( i != 0 )
                    matrix[i][j] += matrix[i - 1][j];
                    
                if ( j != 0 )
                    matrix[i][j] += matrix[i][j - 1];
            }
        }
    }
    
    int count = matrix[n - 1][m - 1];   
    if ( count == 0 )
        std::cout << "Impossible";
    else
        std::cout << count;
}
3
Ternsip
18.05.2012, 12:21
  #5

Не по теме:

diagon, Времени у вас навалом наверное... щедрый вы человек :),или из-за того что Юля17 девушка ?

0
diagon
18.05.2012, 12:23
  #6

Не по теме:

Цитата Сообщение от Ternsip Посмотреть сообщение
diagon, Времени у вас навалом наверное... щедрый вы человек
У меня минуты две на написание ушло, а подобные задачи я уже решал, так что алгоритм придумывать не пришлось.

Цитата Сообщение от Ternsip Посмотреть сообщение
девушки
Ну это еще не факт, что девушка.

0
Ternsip
18.05.2012, 12:31
  #7

Не по теме:

diagon, Самое страшно разгрести буквы в условии

0
0 / 0 / 0
Регистрация: 29.05.2011
Сообщений: 55
14.08.2012, 11:11  [ТС] 8
Узник пытается бежать из замка, который состоит из 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
10111
Выходные данные
impossible
Задачка из городской олимпиады, которая уже прошла, очень хочу узнать как она решается....
0
-=ЮрА=-
14.08.2012, 14:23
  #9

Не по теме:

Цитата Сообщение от Юлия17071992 Посмотреть сообщение
Задачка из городской олимпиады, которая уже прошла, очень хочу узнать как она решается....
- в агусте уже прошла=-O
Думаю это задача может быть описана с помощью алгоритма Дейкстры, в интернете куча ссылок с кодами по этому вопросу...

0
0 / 0 / 0
Регистрация: 29.05.2011
Сообщений: 55
15.08.2012, 10:55  [ТС] 10
Она по-моему в мае проходила, раньше не было времени эту тему создать
0
Higher
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
15.08.2012, 12:40 11
https://www.cyberforum.ru/post3043796.html
0
0 / 0 / 0
Регистрация: 29.05.2011
Сообщений: 55
23.08.2012, 10:31  [ТС] 12
Здравствуйте! Имеем функцию на C++.Помогите исправить ошибки, чтобы выводился правильный результат. Сначало условие, а ниже будет недоработанный код

Попытка к бегству
Узник пытается бежать из замка, который состоит из 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
10111
Выходные данные
impossible

Вот собственно сам код

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
#include <vcl.h>
#include <conio.h>
#include <iostream.h>
#pragma hdrstop
#pragma argsused
 
struct Node
{
   int x,y;
   Node *p;
};
 
Node* top=0;
 
Node* push(Node *top,const int xnew, const int ynew)
{
   Node* pv = new Node;
   pv->x=xnew;
   pv->y=ynew;
   pv->p=top;
   return pv;
}
 
Node* pop(Node*top,int&xcur,int & ycur)
{
   Node *pv=top->p;
   xcur=top->x;
   ycur=top->y;
   delete top;
   return pv;
}
 
int main()
{
   Randomize;
   int nstr,nstb,i,j,fstr,fstb,count,numturn;
   int flab(int x,int y,int **mass, const int nr,const int nc,int count,int numturn);
   cout<<"Enter size of massiv"<<endl;
   cin>>nstr>>nstb;
   
   cout<<"Enter first coordinate"<<endl;
   cin>>fstr>>fstb;
   
   int **M=new int *[nstr];
   
   for(i=0;i<nstr;i++)
      M[i]=new int[nstb];
 
   for(i=0;i<nstr;i++)
      for(j=0;j<nstb;j++)
      {
        if((rand()-rand())>0)
           M[i][j]=1;
        else
           M[i][j]=0;
     }
 
   for(i=0;i<nstr;i++)
   {
      for(j=0;j<nstb;j++)
         cout<<M[i][j]<<' ';
      cout<<endl;
   }
 
   count=0;
   numturn=0;
   M[fstr][fstb]=0;
   int pr=flab(fstr,fstb,M,nstr,nstb,count,numturn);
 
   cout<<endl<<endl;
 
   for(i=0;i<nstr;i++)
   {
      for(j=0;j<nstb;j++)
         cout<<M[i][j]<<' ';
      cout<<endl;
   }
 
   getch();
}
 
   int flab(int x,int y,int **mass, const int nr,const int nc,int count,int numturn)
   {
      int prom;
     
      if(mass[x][y]==0)
      {
         if(x==0||x==nr-1||y==0||y==nc-1)
         {
             cout<<"exit"<<endl;
             return(1);
         }
         else
        {
            mass[x][y]=2;
            count=0;
            numturn++;
            top=push(top,x,y);
         }
   }
   else
   {
      if(count==4)
      {
         if(numturn>0)
         {
            numturn--;
            top=pop(top,x,y);
           count=0;
         }
         else
         {
            cout<<"home"<<endl;
            return 0;
          }
      }
    }
 
   switch(count)
   {
      case 0: count++;
                 prom=flab(x,y-1,mass,nr,nc,count,numturn);
                 break;
 
      case 1: count++;
                 prom=flab(x,y+2,mass,nr,nc,count,numturn);
                 break;
 
     case 2: count++;
                prom=flab(x-1,y-1,mass,nr,nc,count,numturn);
                break;
 
     case 3: count++;
                prom=flab(x+2,y,mass,nr,nc,count,numturn);
                break;
   }
 }
0
Эксперт С++
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
23.08.2012, 10:53 13
Юлия17071992, Если прям для условия задачи, то можно так:
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
#include<iostream>
using namespace std;
int main()
{
    int N, M, i, j;
    scanf("%d %d", &N, &M); 
    int **a, **b;
    a=new int*[N]; b=new int*[N];
    for(i=0; i<N; i++)
    {
        a[i]=new int[M]; b[i]=new int[M];
        for(j=0; j<M; j++)
        {
            cin>>a[i][j]; b[i][j]=0;
        }
    }
    b[N-1][0]=1;
    for(i=1; i<M; i++)
        if(a[N-1][i]==1)
            b[N-1][i]=b[N-1][i-1];
        else
            b[N-1][i]=0;
    for(i=N-2; i>=0; i--)
        if(a[i][0]==1)
            b[i][0]=b[i+1][0];
        else
            b[i][0]=0;
    for(i=N-2; i>=0; i--)
        for(j=1; j<M; j++)
            if(a[i][j]==1)
                b[i][j]=b[i+1][j]+b[i][j-1];
            else
                b[i][j]=0;
    if(b[0][M-1])
        cout<<b[0][M-1]<<endl;  
    else
        cout<<"impossible"<<endl;
    return 0;
}
Кстати, по моему Вам давали похожий по функциональности код, а Вы его почему-то не взяли за основу. Если не секрет, где взяли код, который показываете в этой теме?
1
0 / 0 / 0
Регистрация: 29.05.2011
Сообщений: 55
28.08.2012, 12:43  [ТС] 14
Код начинала писать с моим преподавателем по программированию, но мне был примерный планчик накидан, как он будет выглядеть. И вот что получилось видите сами

Добавлено через 1 минуту
То есть это и есть работающая программка?
0
Заблокирован
Автор FAQ
28.08.2012, 12:51 15
Цитата Сообщение от Юлия17071992 Посмотреть сообщение
То есть это и есть работающая программка?
- да есть здесь 3-х мерный алгоритм Дейкстры так же есть доработка поиска в глубину для решения этой же задачи (верней более широкой - з-х мерного лабиринта), могу приаттачить экзешник...
0
Заблокирован
Автор FAQ
28.08.2012, 13:12 16
Ниже аттачу поиск Дейкстры и поиск в глубину. Скрины отработки для решения именно этого лабиринта
3 5 1
1 1 1 1 1
1 0 1 0 1
1 1 1 1 1
На первом скрине отработка алгоритма который дал по ссылке, на последующих скриншоты отработки приложений из аттача этого поста.

Не по теме:

От себя добавлю : С преподавателем вы концептуально ошиблись при решении данной задачи. Мой совет - кардинально пересмотреть алгоритм поиска!

Миниатюры
найти количество различных маршрутов, ведущих к спасению   найти количество различных маршрутов, ведущих к спасению   найти количество различных маршрутов, ведущих к спасению  

Вложения
Тип файла: rar DeepthSearch.exe.rar (73.8 Кб, 33 просмотров)
Тип файла: rar DeikstraSearch.exe.rar (73.9 Кб, 27 просмотров)
1
Эксперт С++
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
28.08.2012, 13:15 17
Цитата Сообщение от Юлия17071992 Посмотреть сообщение
То есть это и есть работающая программка?
да, это и есть работающая программка

Добавлено через 1 минуту
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
От себя добавлю : С преподавателем вы концептуально оишблись при решении данной задачи. Мой совет - кардинально пересмотреть алгоритм поиска!
самый простой способ решения этой задачи: методом ДП (динамического программирования), проще ничего нет.
0
Заблокирован
Автор FAQ
28.08.2012, 13:19 18
Цитата Сообщение от valeriikozlov Посмотреть сообщение
да, это и есть работающая программка
- Вы сами можете сказать логику какого из известных алгоритмов поиска он использует? И можно поросить вывести пути выхода в качестве числовых значений вершин?(думаю будете разочарованы ответами)

Не по теме:

Я ещё раз повторюсь - неверный у ТС алгоритм поиска, его просто нет, уже хотябы DFS из поиска в глубину применили



Добавлено через 1 минуту
Цитата Сообщение от valeriikozlov Посмотреть сообщение
(динамического программирования), проще ничего нет.
- можно получить ответ на этот вопрос
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
И можно поросить вывести пути выхода в качестве числовых значений вершин?
.

Не по теме:

Обещаю изменить своё мнение если выведите правильные маршруты на экран а не количество (но пока я вижу концептуальную дыру в алгоритме)

0
Эксперт С++
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
28.08.2012, 13:21 19
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- Вы сами можете сказать логику какого из известных алгоритмов поиска он использует?
используется метод ДП.

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
И можно поросить вывести пути выхода в качестве числовых значений вершин?
В этой задаче требуется:
Цитата Сообщение от Юлия17071992 Посмотреть сообщение
Программа должна напечатать количество маршрутов, ведущих узника к выходу и проходящих через M+N-1 комнату, или слово impossible, если таких маршрутов не существует.
Если нужно будет выводить пути выхода в качестве числовых значений вершин, то это будет совсем другая задача. )
0
Заблокирован
Автор FAQ
28.08.2012, 13:24 20
Цитата Сообщение от valeriikozlov Посмотреть сообщение
сли нужно будет выводить пути выхода в качестве числовых значений вершин, то это будет совсем другая задача. )
- суть в том, что подсчитывать можно количество неверных путей, потому и прошу вывести их чтобы было видно какие пути просуммировали.

Не по теме:

valeriikozlov, задачу подсчёта можно реализовать рекурсивным проходом по всем вершинам, а вот прямой перебор как сейчас для меня весьма и весьма сомнителен

0
28.08.2012, 13:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.08.2012, 13:24
Помогаю со студенческими работами здесь

Определить количество ведущих единиц
здарвствуйте все! помогите пожалуйста с заданиями по мере возможностей: 1) представить программу,...

Найти количество всевозможных маршрутов от города до города
Имеется n городов пронумерованных с 1 до n и m соединяющих дорог. Найти количество всевозможных...

Определить количество ведущих нулей старшего байта short int
Представить программу, позволяющую для заданного целочисленного объекта short int определить...

Количество маршрутов
Доброе утро всем!:) Есть задачка. На картинке показаны шесть квадратов и возможные маршруты их...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru