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:



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
  #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
Topic archived. No new replies allowed.