#include <bits/stdc++.h>
using
namespace
std;
bool
hasPath(vector<vector<
int
>> maze, vector<vector<
int
>>& sol,
int
N)
{
for
(
int
i = 0; i < N; i++)
for
(
int
j = 0; j < N; j++)
sol[i][j] = 0;
vector<vector<
bool
>> CRF(N);
for
(
int
i = 0; i < N; i++)
CRF[i] = vector<
bool
>(N);
for
(
int
i = 0; i < N; i++)
for
(
int
j = 0; j < N; j++)
CRF[i][j] =
false
;
CRF[N - 1][N - 1] =
true
;
for
(
int
k = N - 1; k >= 0; k--) {
for
(
int
j = k; j >= 0; j--) {
if
(!(k == N - 1 && j == N - 1)) {
for
(
int
a = 0; a <= maze[k][j]; a++) {
if
((j + a < N && CRF[k][j + a] ==
true
)
|| (k + a < N && CRF[k + a][j] ==
true
)) {
CRF[k][j] =
true
;
break
;
}
}
for
(
int
a = 0; a <= maze[j][k]; a++) {
if
((k + a < N && CRF[j][k + a] ==
true
)
|| (j + a < N && CRF[j + a][k] ==
true
)) {
CRF[j][k] =
true
;
break
;
}
}
}
}
}
if
(CRF[0][0] ==
false
)
return
false
;
int
i = 0, j = 0;
while
(!(i == N - 1 && j == N - 1)) {
sol[i][j] = 1;
if
(maze[i][j] > 0)
for
(
int
a = 1; a <= maze[i][j]; a++) {
if
((j + a < N && CRF[i][j + a] ==
true
)) {
j = j + a;
break
;
}
else
if
((i + a < N && CRF[i + a][j] ==
true
)) {
i = i + a;
break
;
}
}
}
sol[N - 1][N - 1] = 1;
return
true
;
}
void
printMatrix(vector<vector<
int
>> sol,
int
N)
{
for
(
int
i = 0; i < N; i++) {
for
(
int
j = 0; j < N; j++)
cout << sol[i][j] <<
" "
;
cout <<
"\n"
;
}
}
int
main()
{
vector<vector<
int
>> maze = { { 2, 2, 1, 1, 0 },
{ 0, 0, 3, 0, 0 },
{ 1, 0, 0, 0, 0 },
{ 0, 0, 2, 0, 1 },
{ 0, 0, 3, 0, 0 } };
int
N = maze.size();
vector<vector<
int
>> sol(N,vector<
int
>(N));
if
(hasPath(maze, sol, N))
printMatrix(sol, N);
else
cout <<
"No path exists"
;
return
0;
}