### 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.

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.

 ``123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111`` ``````#include "algorithm" #include #include using namespace std; #include // 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; } ``````