- Trending Categories
- Data Structure
- Networking
- RDBMS
- Operating System
- Java
- MS Excel
- iOS
- HTML
- CSS
- Android
- Python
- C Programming
- C++
- C#
- MongoDB
- MySQL
- Javascript
- PHP
- Physics
- Chemistry
- Biology
- Mathematics
- English
- Economics
- Psychology
- Social Studies
- Fashion Studies
- Legal Studies
- Selected Reading
- UPSC IAS Exams Notes
- Developer's Best Practices
- Questions and Answers
- Effective Resume Writing
- HR Interview Questions
- Computer Glossary
- Who is Who
Find paths from corner cell to middle cell in maze in C++
Suppose we have a square maze filled with numbers; we have to find all paths from a corner cell to the middle cell. Here, we will proceed exactly n steps from a cell in 4 directions Up, Down, Right and Left where n is the value of the cell. Thus, we can move to cell [i+n,j] to [i-n, j], [i, j+n], and [i, j-n] from a cell [i,j] where n is value of cell [i, j].
So, if the input is like
3 | 4 | 4 | 4 | 7 | 3 | 4 | 6 | 3 |
6 | 7 | 5 | 6 | 6 | 2 | 6 | 6 | 2 |
3 | 3 | 4 | 3 | 2 | 5 | 4 | 7 | 2 |
6 | 5 | 5 | 1 | 2 | 3 | 6 | 5 | 6 |
3 | 3 | 4 | 3 | 0 | 1 | 4 | 3 | 4 |
3 | 3 | 4 | 3 | 2 | 1 | 3 | 3 | 5 |
3 | 5 | 4 | 3 | 2 | 6 | 4 | 4 | 3 |
3 | 5 | 1 | 3 | 7 | 5 | 3 | 6 | 3 |
6 | 2 | 4 | 3 | 4 | 5 | 4 | 5 | 1 |
then the output will be
(0, 0)→(0, 3)→(0, 7)→(6, 7)→(6, 3)→(3, 3)→(3, 4)→(5, 4)→(5, 2)→(1, 2)→(1, 7)→(7, 7)→(7, 1)→(2, 1)→(5, 1)→(0, 1)→(4, 1)→(4, 4)→MIDDLE
(0, 0)→(0, 3)→(0, 7)→(6, 7)→(6, 3)→(3, 3)→(3, 4)→(5, 4)→(5, 2)→(1, 2)→(1, 7)→(7, 7)→(7, 1)→(2, 1)→(2, 4)→(4, 4→MIDDLE
(0, 0)→(0, 3)→(0, 7)→(0, 1)→(4, 1)→(7, 1)→(2, 1)→(2, 4)→(4, 4)→MIDDLE
(0, 0)→(0, 3)→(0, 7)→(0, 1)→(4, 1)→(4, 4)→MIDDLE
(8, 8)→(7, 8)→(4, 8)→(4, 4)→MIDDLE
To solve this, we will follow these steps −
N := 9
Define a function is_ok(), this will take one set of pairs called visited, one pair pt,
return true when first and second element of pt in range 0 to N and pt is not in visited
Define an array dir_row := { - 1, 1, 0, 0}
Define an array dir_col := { 0, 0, - 1, 1}
Define an array row := { 0, 0, N - 1, N - 1}
Define an array col := { 0, N - 1, 0, N - 1}
Define a function solve(), this will take maze, path, one set of pairs visited, one pair curr,
if first and second of curr is same as N / 2, then −
display the path
return
for initialize i := 0, when i < 4, update (increase i by 1), do −
n := maze[curr.first, curr.second]
x := curr.first + dir_row[i] * n
y := curr.second + dir_col[i] * n
n := a pair using x, y
if is_ok(visited, next), then −
insert next into visited
insert next at the end of path
solve(maze, path, visited, next)
delete last element from path
delete next from visited
From the main method, do the following −
Define one set of pairs called visited
for initialize i := 0, when i < 4, update (increase i by 1), do −
x := row[i]
y := col[i]
pt := make a pair using (x, y)
insert pt into visited
insert pt at the end of path
solve(maze, path, visited, pt)
delete last element from path
delete pt from visited
Example (C++)
Let us see the following implementation to get better understanding −
#include <bits/stdc++.h> using namespace std; #define N 9 bool is_ok(set<pair<int, int> > visited, pair<int, int> pt) { return (pt.first >= 0) && (pt.first < N) && (pt.second >= 0) && (pt.second < N) && (visited.find(pt) == visited.end()); } void display_path(list<pair<int, int> > path) { for (auto it = path.begin(); it != path.end(); it++) cout << "(" << it->first << ", " << it->second << ")->"; cout << "MIDDLE" << endl << endl; } int dir_row[] = {-1, 1, 0, 0}; int dir_col[] = { 0, 0, -1, 1}; int row[] = { 0, 0, N-1, N-1}; int col[] = { 0, N-1, 0, N-1}; void solve(int maze[N][N], list<pair<int, int> > &path, set<pair<int, int> > &visited, pair<int, int> &curr) { if (curr.first == N / 2 && curr.second == N / 2) { display_path(path); return; } for (int i = 0; i < 4; ++i) { int n = maze[curr.first][curr.second]; int x = curr.first + dir_row[i]*n; int y = curr.second + dir_col[i]*n; pair<int, int> next = make_pair(x, y); if (is_ok(visited, next)) { visited.insert(next); path.push_back(next); solve(maze, path, visited, next); path.pop_back(); visited.erase(next); } } } void search_path(int maze[N][N]) { list<pair<int, int> > path; set<pair<int, int> > visited; for (int i = 0; i < 4; ++i) { int x = row[i]; int y = col[i]; pair<int, int> pt = make_pair(x, y); visited.insert(pt); path.push_back(pt); solve(maze, path, visited, pt); path.pop_back(); visited.erase(pt); } } int main() { int maze[N][N] = { {3, 4, 4, 4, 7, 3, 4, 6, 3}, {6, 7, 5, 6, 6, 2, 6, 6, 2}, {3, 3, 4, 3, 2, 5, 4, 7, 2}, {6, 5, 5, 1, 2, 3, 6, 5, 6}, {3, 3, 4, 3, 0, 1, 4, 3, 4}, {3, 5, 4, 3, 2, 1, 3, 3, 5}, {3, 5, 4, 3, 2, 6, 4, 4, 3}, {3, 5, 1, 3, 7, 5, 3, 6, 3}, {6, 2, 4, 3, 4, 5, 4, 5, 1} }; search_path(maze); }
Input
{{3, 4, 4, 4, 7, 3, 4, 6, 3}, {6, 7, 5, 6, 6, 2, 6, 6, 2}, {3, 3, 4, 3, 2, 5, 4, 7, 2}, {6, 5, 5, 1, 2, 3, 6, 5, 6}, {3, 3, 4, 3, 0, 1, 4, 3, 4}, {3, 5, 4, 3, 2, 1, 3, 3, 5}, {3, 5, 4, 3, 2, 6, 4, 4, 3}, {3, 5, 1, 3, 7, 5, 3, 6, 3}, {6, 2, 4, 3, 4, 5, 4, 5, 1}}
Output
(0, 0)->(0, 3)->(0, 7)->(6, 7)->(6, 3)->(3, 3)->(3, 4)->(5, 4)->(5, 2)->(1, 2)->(1, 7)->(7, 7)->(7, 1)->(2, 1)->(5, 1)->(0, 1)->(4, 1)->(4, 4)->MIDDLE (0, 0)->(0, 3)->(0, 7)->(6, 7)->(6, 3)->(3, 3)->(3, 4)->(5, 4)->(5, 2)->(1, 2)->(1, 7)->(7, 7)->(7, 1)->(2, 1)->(2, 4)->(4, 4)->MIDDLE (0, 0)->(0, 3)->(0, 7)->(0, 1)->(4, 1)->(7, 1)->(2, 1)->(2, 4)->(4, 4)->MIDDLE (0, 0)->(0, 3)->(0, 7)->(0, 1)->(4, 1)->(4, 4)->MIDDLE (8, 8)->(7, 8)->(4, 8)->(4, 4)->MIDDLE