Modified maze problem

There is a matrix which contains white cells(represented as 1) , black cells(represented as 0) and only one gray cell(represented as 2), need to go from (0,0) to (N-1, N-1) in Array[N][N].
constraints:
1) The path should cover only white cells and must go via grey cell (this grey cell can be anywhere in the array)
2) The node once visited cannot be visited again.


I am not able to solve this problem.....please help.

Language: C

Below is the typical maze problem solution but this solution doesn't handle the specific case of traversing GREY cell...so can you please help me in modifying the below code to handle the specific case:



#include "stdafx.h"
#include "algorithm"
#include <iostream>
#include <fstream>
using namespace std;
#include<stdio.h>

// Maze size
#define N 4

bool solveMazeUtil(int maze[N][N], int x, int y, int sol[N][N]);

/* A utility function to print solution matrix sol[N][N] */
void printSolution(int sol[N][N])
{
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
printf(" %d ", sol[i][j]);
printf("\n");
}
}

/* A utility function to check if x,y is valid index for N*N maze */
bool isSafe(int maze[N][N], int x, int y)
{
//solveMazeUtil() to solve the problem. It returns false if no path is possible,
//otherwise return true and prints the path in the form of 1s. Please note that
//there may be more than one solutions, this function prints one of the feasible
if(x >= 0 && x < N && y >= 0 && y < N && maze[x][y] == 1)
// if (x,y outside maze) return false
return true;

return false;
}

/* This function solves the Maze problem using Backtracking. It mainly uses
solutions.*/
bool solveMaze(int maze[N][N])
{
int sol[N][N] = { {0, 0, 0, 0},
{0, 0, 0, 0},
{0, 0, 0, 0},
{0, 0, 0, 0}
};

if(solveMazeUtil(maze, 0, 0, sol) == false)
{
printf("Solution doesn't exist");
return false;
}

printSolution(sol);
return true;
}

/* A recursive utility function to solve Maze problem */
bool solveMazeUtil(int maze[N][N], int x, int y, int sol[N][N])
{
// if (x,y is goal) return true
if(x == N-1 && y == N-1)
{
sol[x][y] = 1;
return true;
}

// Check if maze[x][y] is valid
if(isSafe(maze, x, y) == true)
{
// mark x,y as part of solution path
sol[x][y] = 1;

/* Move forward in x direction */
if (solveMazeUtil(maze, x+1, y, sol) == true)
return true;

/* If x moving in x direction doesn't give solution then
Move down in y direction */
if (solveMazeUtil(maze, x, y+1, sol) == true)
return true;

/* If none of the above movements work then BACKTRACK:
unmark x,y as part of solution path */
sol[x][y] = 0;
return false;
}

return false;
}

// driver program to test above function
int main()
{
int maze[N][N] = { {1, 0, 0, 0},
{1, 1, 0, 1},
{0, 1, 0, 0},
{1, 1, 1, 1}
};

solveMaze(maze);
getchar();
return 0;
}
Hi dayanand,
Since your problem is a modified maze problem, the good news is that it's very similar to the origin problem, which only has white(can pass) and black(can not pass) cell.

So forgive me to assum that you can solve the origin maze problem, then you just need to add a check function to see if all your "grey cells" are visited.
Hi Yueeng,

If you don't mind, can you please help me with the code snippet for the aforesaid condition?

First of all, you should use the code format to embrace your code, so it's more comfortable to read.

The following code will do the job, I made a little change to your original code. And commented them using uppercase letter.

The basic idea is set a global variable for grey cells, mark the variable when step on grey cell, finally check the variable's value when determining the "finish" situation.

Hope this will be helpful.

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
#include "algorithm"
#include <iostream>
#include <fstream>
using namespace std;
#include<stdio.h>

// Maze size
#define N 4
bool bvisited_grey_cell=false;//ADD A GLOBAL VARIABLE FOR GREY CELL

bool solveMazeUtil(int maze[N][N], int x, int y, int sol[N][N]);

/* A utility function to print solution matrix sol[N][N] */
void printSolution(int sol[N][N])
{
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
            printf(" %d ", sol[i][j]);
        printf("\n");
    }
}

/* A utility function to check if x,y is valid index for N*N maze */
bool isSafe(int maze[N][N], int x, int y)
{
//solveMazeUtil() to solve the problem. It returns false if no path is possible,
//otherwise return true and prints the path in the form of 1s. Please note that
//there may be more than one solutions, this function prints one of the feasible
    if(x >= 0 && x < N && y >= 0 && y < N && (maze[x][y] == 1 || maze[x][y]==2))//GREY CELL IS ALSO SAFE
// if (x,y outside maze) return false
        return true;

    return false;
}

/* This function solves the Maze problem using Backtracking. It mainly uses
solutions.*/
bool solveMaze(int maze[N][N])
{
    int sol[N][N] = { {0, 0, 0, 0},
        {0, 0, 0, 0},
        {0, 0, 0, 0},
        {0, 0, 0, 0}
    };

    if(solveMazeUtil(maze, 0, 0, sol) == false)
    {
        printf("Solution doesn't exist");
        return false;
    }

    printSolution(sol);
    return true;
}

/* A recursive utility function to solve Maze problem */
bool solveMazeUtil(int maze[N][N], int x, int y, int sol[N][N])
{
// if (x,y is goal) return true
    if(x == N-1 && y == N-1)
    {
		if (bvisited_grey_cell==true)// CHECK IS GREY CELL VISITED
		{
			sol[x][y] = 1;
			return true;
		}
    }

// Check if maze[x][y] is valid
    if(isSafe(maze, x, y) == true)
    {
// mark x,y as part of solution path
		if (maze[x][y]==2)// ARE WE ON GREY CELL? MARK IT.
			bvisited_grey_cell=true;

        sol[x][y] = 1;

        /* Move forward in x direction */
        if (solveMazeUtil(maze, x+1, y, sol) == true)
            return true;

        /* If x moving in x direction doesn't give solution then
        Move down in y direction */
        if (solveMazeUtil(maze, x, y+1, sol) == true)
            return true;

        /* If none of the above movements work then BACKTRACK:
        unmark x,y as part of solution path */
        sol[x][y] = 0;
        return false;
    }

    return false;
}

// driver program to test above function
int main()
{
	// CHANGE THE MAZE TO TEST GREY CELL
    int maze[N][N] = { {1, 0, 0, 0},
        {1, 1, 2, 1},
        {0, 1, 0, 0},
        {1, 1, 1, 1}
    };

    solveMaze(maze);
    getchar();
    return 0;
}
Last edited on
Topic archived. No new replies allowed.