#embrace <bits/stdc++.h>
utilizing namespace std;
bool is_valid(int x, int y, vector<vector<int> >& grid)
{
if (x < 0 || y < 0 || x >= grid.measurement()
|| y >= grid[0].measurement()) {
return 0;
}
return 1;
}
void dfs(int x, int y, vector<vector<bool> >& visited,
vector<vector<int> >& grid)
{
if (visited[x][y])
return;
visited[x][y] = 1;
int up = 0, down = 0, left = 0, proper = 0;
if (grid[x][y] == 1) {
left = 1;
proper = 1;
}
else if (grid[x][y] == 2) {
up = 1;
down = 1;
}
else if (grid[x][y] == 3) {
left = 1;
down = 1;
}
else if (grid[x][y] == 4) {
down = 1;
proper = 1;
}
else if (grid[x][y] == 5) {
up = 1;
left = 1;
}
else {
proper = 1;
up = 1;
}
if (up) {
int new_x = x - 1, new_y = y;
if (is_valid(new_x, new_y, grid)
&& (grid[new_x][new_y] == 2
|| grid[new_x][new_y] == 3
|| grid[new_x][new_y] == 4)) {
dfs(new_x, new_y, visited, grid);
}
}
if (down) {
int new_x = x + 1, new_y = y;
if (is_valid(new_x, new_y, grid)
&& (grid[new_x][new_y] == 2
|| grid[new_x][new_y] == 5
|| grid[new_x][new_y] == 6)) {
dfs(new_x, new_y, visited, grid);
}
}
if (left) {
int new_x = x, new_y = y - 1;
if (is_valid(new_x, new_y, grid)
&& (grid[new_x][new_y] == 1
|| grid[new_x][new_y] == 4
|| grid[new_x][new_y] == 6)) {
dfs(new_x, new_y, visited, grid);
}
}
if (proper) {
int new_x = x, new_y = y + 1;
if (is_valid(new_x, new_y, grid)
&& (grid[new_x][new_y] == 1
|| grid[new_x][new_y] == 3
|| grid[new_x][new_y] == 5)) {
dfs(new_x, new_y, visited, grid);
}
}
}
int principal()
{
vector<vector<int> > grid
= { { 2, 4, 3 }, { 6, 5, 2 } };
int N = grid.measurement(), M = grid[0].measurement();
vector<vector<bool> > visited(N, vector<bool>(M, 0));
dfs(0, 0, visited, grid);
if (visited[N - 1][M - 1])
cout << "Possiblen";
else
cout << "Impossiblen";
return 0;
}