Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
Java, C# - Expert
 Аватар для IceSqueez
69 / 69 / 12
Регистрация: 09.08.2011
Сообщений: 284

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

15.04.2012, 12:32. Показов 1530. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите решить задачку )

Задачка:
1 Попытка к бегству

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

Идентификатор для autotest: ol001

Узник пытается бежать из замка, который состоит из 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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Numeric;
 
namespace Olymp001
{
    class Program
    {
        static void Main()
        {
            int[,] a = new int[5,4];
            for (int i=0; i<n; i++)
            {
                for (int j=0; j<m; j++)
                {
                    a[i,j]= Convert.ToInt32(Console.Read());
                }
            }
            int quit = 0, move = 0, count = 0;
            while (quit != 150)
            {
                move = 0;
                int posi=n-1, posj=0;
                for (int i = n - 1; i < 0; i--)
                {
                    for (int j = 0; j > m; j++)
                    {
                        if (move == (m + n) - 1)
                        {
                            break;
                            break;
                        }
                        else
                        {
                            if ((a[i,j] == 1)&&(Math.Abs(i-posi)==1)&&(Math.Abs(j-posj)==1))
                            {
                                posi = i;
                                posj = j;
                                move++;
                            }
                            if ((posi==n-1)&&(posj==0))
                            {
                                count++;
                            }
                        }
                    }
                }
                quit++;
            }
            Console.WriteLine("Количество выходов: " + count);
        }
    }
}
Добавлено через 12 часов 51 минуту
У кого-то есть хотя-бы какие-то соображения по этому поводу ??

у себя я могу найти только 1 решение... и то... карявое
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.04.2012, 12:32
Ответы с готовыми решениями:

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

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

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

1
79 / 79 / 12
Регистрация: 07.01.2012
Сообщений: 167
18.04.2012, 16:33
Выводим все возможные пути без циклов

Classes

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
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
using System.Collections.Generic;
using System.Linq;
using System.Collections;
 
namespace GraphSolution
{
    public class Graph
    {
        public int[,] Schema;                                                   // adjacency Matrix
        public ArrayList AttainableNodes = new ArrayList();
        public List<Dependency> Dependencies { get; private set; }
        public int[,] NumerableSchema;
        /// <summary>
        /// Returns graph
        /// </summary>
        /// <returns></returns>
        public Graph(int[,] schema)
        {
                this.Schema = schema;
                this.NumerableSchema = new int[schema.GetLength(0),schema.GetLength(1)];
                int N = this.Schema.GetLength(0);
                int M = this.Schema.GetLength(1);
            # region Смотрим есть ли соседние открытые комнаты и открываем в них двери(Создаем ребра + топографически сортируем)
            //        
            //         [i+1,j]
            //            ^
            //            |
            //[i,j-1]-->[i,j]--->[i,j+1]
            //            ^
            //            |
            //         [i-1,j]
 
            this.Dependencies = new List<Dependency>();                                                                 //Empty list of dependencies
            for (int i = 0; i < N; i++)
                for (int j = 0; j < M; j++)
                {
                    # region если текущая комната открыта то создаем от нее связи "вверх по нумерации"
                    if (this.Schema[i, j] == 1)                                                                         //current node is available
                    {
                        if ((i + 1) < N && this.Schema[i + 1, j] == 1)                                                  //next node exist and available
                        {
                            Dependency dependency1 = new Dependency(i * M + j, (i + 1) * M + j);
                            if (Dependencies.Find(_dependency => (_dependency.NodeFrom == dependency1.NodeFrom &&
                                                                _dependency.NodeTo == dependency1.NodeTo)) == null)
                                Dependencies.Add(dependency1);
                        }
                        if ((j + 1) < M && this.Schema[i, j + 1] == 1)                                                  //next node exist and available
                        {
                            Dependency dependency2 = new Dependency(i * M + j, i * M + j + 1);
                            if (Dependencies.Find(_dependency => ((_dependency.NodeFrom == dependency2.NodeFrom) &&
                                                                  (_dependency.NodeTo == dependency2.NodeTo))) == null)
                                Dependencies.Add(dependency2);                                                          //Add connection right
                        }
                        this.AttainableNodes.Add(i * M + j);
                    }
                    this.NumerableSchema[i, j] = i * M + j;
                }
                    #endregion
            #endregion
        }
 
 
 
        /// <summary>
        /// Returns unvisited nodes which is connected to parent node or null
        /// </summary>
        /// <param name="ParentNode">Parent Node</param>
        /// <param name="Dependencies">List of dependencies</param>
        /// <returns>List of unvisited nodes which is connected to parent node or null</returns>
        private List<int> GetUnvisitedChildNodes(int Parent)
        {
            List<int> result = new List<int>();
                List<Dependency> DependenciesFromParent = this.Dependencies.FindAll(dependency => dependency.NodeFrom == Parent);
                foreach (Dependency dependency in DependenciesFromParent)                
                    result.Add(dependency.NodeTo);
 
                List<Dependency> DependenciesToParent = this.Dependencies.FindAll(dependency => dependency.NodeTo == Parent);
                foreach (Dependency dependency in DependenciesToParent)
                    result.Add(dependency.NodeFrom);                
                return result;
        }
 
        public List<Path> SearchAllPaths(int NodeFrom, int NodeTo)
        {
            //Create new list of paths
            List<Path> FoundPaths = new List<Path>();
            Queue<Path> q = new Queue<Path>();
            Path path = new Path();
            path.Nodes.Add(NodeFrom);
            q.Enqueue(path);
            while (q.Any())                                                                                 //while queue isn't empty
            {
                Path tempPath = q.Dequeue();                                                                //Gets first path from queue
                List<int> childNodes = GetUnvisitedChildNodes(tempPath.Nodes[tempPath.Nodes.Count - 1]);    //Gets all children by last node of tempPath
                foreach (int child in childNodes)                                                           //For each child in children
                {
                    Path newPath = new Path();                                                              //Reset newPath
                    newPath = tempPath.CreateCopy();                                                    //Copy nodes from tempPath to new path
                    if (!newPath.Nodes.Contains(child))                                                     //Reset paths with cycles
                    {
                        newPath.Nodes.Add(child);                                                           //Increment pass with child
                        if (!q.Contains(newPath))
                        {
                            q.Enqueue(newPath);                                                             //Add newPath to the end of queue                
                            if (child == NodeTo &&
                                !FoundPaths.Contains(newPath))                                              //if  target path is found
                            {
                                FoundPaths.Add(newPath);                                                    //Add target path to List of paths
                            }
                        }
                    }
                }
            }
            return FoundPaths;
        }
 
    }
    
    public class Dependency
    {
        public int NodeFrom { get; set; }
        public int NodeTo { get; set; }
 
        public Dependency(int nodeFrom, int nodeTo)
        {
            this.NodeFrom = nodeFrom;
            this.NodeTo = nodeTo;
        }
 
        public override string ToString()
        {
            return (this.NodeFrom).ToString()
                    + " - " +
                   (this.NodeTo).ToString();
        }
    }
 
    public class Path
    {
        private List<int> nodes;
        public List<int> Nodes { get { return nodes; } set { nodes = value; } }
 
        public Path()
        {
            this.nodes = new List<int>();
        }
 
        public Path CreateCopy()
        {
            Path path = new Path();
            foreach (int node in this.nodes)
                path.Nodes.Add(node);
            return path;
        }
 
        public override string ToString()
        {
            string result = "";
            foreach (int node in this.nodes)
                result = result + node.ToString() + ", ";
            return result;
            
        }        
    }
}

Main

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
using System;
using System.Collections.Generic;
 
namespace GraphSolution
{
    class Program
    {
        static void Main(string[] args)
        {
            Graph Castle = new Graph(
                   new int[5,10]{ {1,1,1,1,1,0,1,1,1,1},
                                  {1,0,1,0,1,0,1,1,0,0},
                                  {1,1,1,1,1,1,1,1,1,1},
                                  {0,1,0,1,0,1,0,1,0,1},
                                  {1,1,1,1,1,0,1,1,1,1} });
            //Output list of dependencies
            for (int i = 0; i < Castle.Dependencies.Count; i++)
                Console.WriteLine("{0,3} Connection {1}", i, Castle.Dependencies[i].ToString());
            Console.WriteLine();
            //Output AttainableNodes
            for (int i = 0; i < Castle.AttainableNodes.Count; i++)
                Console.Write("{0,3},",Castle.AttainableNodes[i].ToString());
            Console.WriteLine();
            Console.WriteLine();
            //Output Digital Schema
            DisplayArray(Castle.Schema);
            //Output NumerableSchema
            DisplayArray(Castle.NumerableSchema);
            Console.WriteLine();
            //Input nodes for finding
            int nodeFrom = 0;
            int nodeTo = 0;
            Console.WriteLine("Type number of node from which start path");
            int.TryParse(Console.ReadLine(), out nodeFrom);
            Console.WriteLine("Type number of node to which end path");
            int.TryParse(Console.ReadLine(), out nodeTo);
 
            //Output paths
            Console.WriteLine("Paths are found from {0} to {1} :",nodeFrom, nodeTo);
            List<Path> FoundPaths = Castle.SearchAllPaths(nodeFrom, nodeTo);
            for (int i = 0; i < FoundPaths.Count; i++)
                Console.WriteLine("{1} Path: {0}", FoundPaths[i].ToString(),i+1);
            Console.ReadLine();
        }
 
        private static void DisplayArray(int[,] Array)
        {
            Console.WriteLine();
            Console.WriteLine();
            //Output NumerableSchema
            for (int i = 0; i < Array.GetLength(0); i++)
            {
                string result = "";
                for (int j = 0; j < Array.GetLength(1); j++)
                {
                    result = result + string.Format("{0,4}", Array[i, j].ToString());
                }
                Console.WriteLine(result);
            }
        }
    }
}

Вывод
Code
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
  0 Connection 0 - 10
  1 Connection 0 - 1
  2 Connection 1 - 2
  3 Connection 2 - 12
  4 Connection 2 - 3
  5 Connection 3 - 4
  6 Connection 4 - 14
  7 Connection 6 - 16
  8 Connection 6 - 7
  9 Connection 7 - 17
 10 Connection 7 - 8
 11 Connection 8 - 9
 12 Connection 10 - 20
 13 Connection 12 - 22
 14 Connection 14 - 24
 15 Connection 16 - 26
 16 Connection 16 - 17
 17 Connection 17 - 27
 18 Connection 20 - 21
 19 Connection 21 - 31
 20 Connection 21 - 22
 21 Connection 22 - 23
 22 Connection 23 - 33
 23 Connection 23 - 24
 24 Connection 24 - 25
 25 Connection 25 - 35
 26 Connection 25 - 26
 27 Connection 26 - 27
 28 Connection 27 - 37
 29 Connection 27 - 28
 30 Connection 28 - 29
 31 Connection 29 - 39
 32 Connection 31 - 41
 33 Connection 33 - 43
 34 Connection 37 - 47
 35 Connection 39 - 49
 36 Connection 40 - 41
 37 Connection 41 - 42
 38 Connection 42 - 43
 39 Connection 43 - 44
 40 Connection 46 - 47
 41 Connection 47 - 48
 42 Connection 48 - 49
 
  0,  1,  2,  3,  4,  6,  7,  8,  9, 10, 12, 14, 16, 17, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 31, 33, 35, 37, 39, 40,
 41, 42, 43, 44, 46, 47, 48, 49,
 
 
 
   1   1   1   1   1   0   1   1   1   1
   1   0   1   0   1   0   1   1   0   0
   1   1   1   1   1   1   1   1   1   1
   0   1   0   1   0   1   0   1   0   1
   1   1   1   1   1   0   1   1   1   1
 
 
   0   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
 
Type number of node from which start path
40
Type number of node to which end path
9
Paths are found from 40 to 9 :
1 Path: 40, 41, 42, 43, 33, 23, 24, 25, 26, 27, 17, 7, 8, 9,
2 Path: 40, 41, 42, 43, 33, 23, 24, 25, 26, 16, 17, 7, 8, 9,
3 Path: 40, 41, 42, 43, 33, 23, 24, 25, 26, 16, 6, 7, 8, 9,
4 Path: 40, 41, 31, 21, 22, 23, 24, 25, 26, 27, 17, 7, 8, 9,
5 Path: 40, 41, 31, 21, 22, 23, 24, 25, 26, 16, 17, 7, 8, 9,
6 Path: 40, 41, 31, 21, 22, 23, 24, 25, 26, 16, 6, 7, 8, 9,
7 Path: 40, 41, 42, 43, 33, 23, 24, 25, 26, 27, 17, 16, 6, 7, 8, 9,
8 Path: 40, 41, 31, 21, 22, 23, 24, 25, 26, 27, 17, 16, 6, 7, 8, 9,
9 Path: 40, 41, 31, 21, 22, 12, 2, 3, 4, 14, 24, 25, 26, 27, 17, 7, 8, 9,
10 Path: 40, 41, 31, 21, 22, 12, 2, 3, 4, 14, 24, 25, 26, 16, 17, 7, 8, 9,
11 Path: 40, 41, 31, 21, 22, 12, 2, 3, 4, 14, 24, 25, 26, 16, 6, 7, 8, 9,
12 Path: 40, 41, 42, 43, 33, 23, 22, 12, 2, 3, 4, 14, 24, 25, 26, 27, 17, 7, 8, 9,
13 Path: 40, 41, 42, 43, 33, 23, 22, 12, 2, 3, 4, 14, 24, 25, 26, 16, 17, 7, 8, 9,
14 Path: 40, 41, 42, 43, 33, 23, 22, 12, 2, 3, 4, 14, 24, 25, 26, 16, 6, 7, 8, 9,
15 Path: 40, 41, 31, 21, 22, 12, 2, 3, 4, 14, 24, 25, 26, 27, 17, 16, 6, 7, 8, 9,
16 Path: 40, 41, 31, 21, 20, 10, 0, 1, 2, 12, 22, 23, 24, 25, 26, 27, 17, 7, 8, 9,
17 Path: 40, 41, 31, 21, 20, 10, 0, 1, 2, 12, 22, 23, 24, 25, 26, 16, 17, 7, 8, 9,
18 Path: 40, 41, 31, 21, 20, 10, 0, 1, 2, 12, 22, 23, 24, 25, 26, 16, 6, 7, 8, 9,
19 Path: 40, 41, 31, 21, 20, 10, 0, 1, 2, 3, 4, 14, 24, 25, 26, 27, 17, 7, 8, 9,
20 Path: 40, 41, 31, 21, 20, 10, 0, 1, 2, 3, 4, 14, 24, 25, 26, 16, 17, 7, 8, 9,
21 Path: 40, 41, 31, 21, 20, 10, 0, 1, 2, 3, 4, 14, 24, 25, 26, 16, 6, 7, 8, 9,
22 Path: 40, 41, 42, 43, 33, 23, 22, 12, 2, 3, 4, 14, 24, 25, 26, 27, 17, 16, 6, 7, 8, 9,
23 Path: 40, 41, 31, 21, 20, 10, 0, 1, 2, 12, 22, 23, 24, 25, 26, 27, 17, 16, 6, 7, 8, 9,
24 Path: 40, 41, 31, 21, 20, 10, 0, 1, 2, 3, 4, 14, 24, 25, 26, 27, 17, 16, 6, 7, 8, 9,
25 Path: 40, 41, 42, 43, 33, 23, 22, 21, 20, 10, 0, 1, 2, 3, 4, 14, 24, 25, 26, 27, 17, 7, 8, 9,
26 Path: 40, 41, 42, 43, 33, 23, 22, 21, 20, 10, 0, 1, 2, 3, 4, 14, 24, 25, 26, 16, 17, 7, 8, 9,
27 Path: 40, 41, 42, 43, 33, 23, 22, 21, 20, 10, 0, 1, 2, 3, 4, 14, 24, 25, 26, 16, 6, 7, 8, 9,
28 Path: 40, 41, 42, 43, 33, 23, 22, 21, 20, 10, 0, 1, 2, 3, 4, 14, 24, 25, 26, 27, 17, 16, 6, 7, 8, 9,
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.04.2012, 16:33
Помогаю со студенческими работами здесь

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

Определить, сколько существует различных маршрутов, ведущих из левого верхнего в правый нижний угол
Дана прямоугольная доска N × M (N строк и M столбцов). В левом верхнем углу находится шахматный конь, которого необходимо переместить в...

Функция getPies(mapAlice) для печати количество различных маршрутов
У Боба есть электрический самокат, на котором он любит кататься по городу. В зависимости от режима работы, самокат способен проходить 1, 2...

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

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


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru