#include <cmath>
#include <iostream>
#define N 3 // row of grid
#define M 4 // column of grid
#define UNASSIGNED -1
using
namespace
std;
bool
UsedInGrid(
int
grid[N][M],
int
num)
{
for
(
int
i = 0; i < N; i++) {
for
(
int
j = 0; j < M; j++)
if
(grid[i][j] == num)
return
true
;
}
return
false
;
}
bool
isSafe(
int
grid[N][M],
int
row,
int
col,
int
num)
{
if
(row == 0 && col == 1) {
if
(UsedInGrid(grid, num)
|| (
abs
(num - grid[row][col + 1]) <= 1)
|| (
abs
(num - grid[row + 1][col]) <= 1)
|| (
abs
(num - grid[row + 1][col - 1]) <= 1)
|| (
abs
(num - grid[row + 1][col + 1]) <= 1))
return
false
;
}
else
if
(row == 0 && col == 2) {
if
(UsedInGrid(grid, num)
|| (
abs
(num - grid[row][col - 1]) <= 1)
|| (
abs
(num - grid[row + 1][col]) <= 1)
|| (
abs
(num - grid[row + 1][col + 1]) <= 1)
|| (
abs
(num - grid[row + 1][col - 1]) <= 1))
return
false
;
}
else
if
(row == 1 && col == 0) {
if
(UsedInGrid(grid, num)
|| (
abs
(num - grid[row - 1][col + 1]) <= 1)
|| (
abs
(num - grid[row][col + 1]) <= 1)
|| (
abs
(num - grid[row + 1][col + 1]) <= 1))
return
false
;
}
else
if
(row == 1 && col == 3) {
if
(UsedInGrid(grid, num)
|| (
abs
(num - grid[row - 1][col - 1]) <= 1)
|| (
abs
(num - grid[row][col - 1]) <= 1)
|| (
abs
(num - grid[row + 1][col - 1]) <= 1))
return
false
;
}
else
if
(row == 2 && col == 1) {
if
(UsedInGrid(grid, num)
|| (
abs
(num - grid[row - 1][col - 1]) <= 1)
|| (
abs
(num - grid[row - 1][col]) <= 1)
|| (
abs
(num - grid[row - 1][col + 1]) <= 1)
|| (
abs
(num - grid[row][col + 1]) <= 1))
return
false
;
}
else
if
(row == 2 && col == 2) {
if
(UsedInGrid(grid, num)
|| (
abs
(num - grid[row][col - 1]) <= 1)
|| (
abs
(num - grid[row - 1][col]) <= 1)
|| (
abs
(num - grid[row - 1][col + 1]) <= 1)
|| (
abs
(num - grid[row - 1][col - 1]) <= 1))
return
false
;
}
else
if
(row == 1 && col == 1) {
if
(UsedInGrid(grid, num)
|| (
abs
(num - grid[row][col - 1]) <= 1)
|| (
abs
(num - grid[row - 1][col]) <= 1)
|| (
abs
(num - grid[row - 1][col + 1]) <= 1)
|| (
abs
(num - grid[row][col + 1]) <= 1)
|| (
abs
(num - grid[row + 1][col + 1]) <= 1)
|| (
abs
(num - grid[row + 1][col]) <= 1))
return
false
;
}
else
if
(row == 1 && col == 2) {
if
(UsedInGrid(grid, num)
|| (
abs
(num - grid[row][col - 1]) <= 1)
|| (
abs
(num - grid[row - 1][col]) <= 1)
|| (
abs
(num - grid[row + 1][col - 1]) <= 1)
|| (
abs
(num - grid[row][col + 1]) <= 1)
|| (
abs
(num - grid[row - 1][col - 1]) <= 1)
|| (
abs
(num - grid[row + 1][col]) <= 1))
return
false
;
}
return
true
;
}
bool
FindUnassignedLocation(
int
grid[N][M],
int
& row,
int
& col)
{
for
(row = 0; row < N; row++)
for
(col = 0; col < M; col++) {
if
(grid[row][col] == UNASSIGNED)
return
true
;
}
return
false
;
}
void
printGrid(
int
grid[N][M])
{
for
(
int
i = 0; i < N; i++) {
if
(i == 0 || i == N - 1)
cout <<
" "
;
for
(
int
j = 0; j < M; j++) {
if
(grid[i][j] == 0)
cout <<
" "
;
else
cout << grid[i][j] <<
" "
;
}
cout << endl;
}
}
bool
Solve(
int
grid[N][M])
{
int
row, col;
if
(!FindUnassignedLocation(grid, row, col))
return
true
;
for
(
int
num = 1; num <= 8; num++) {
if
(isSafe(grid, row, col, num)) {
grid[row][col] = num;
if
(Solve(grid))
return
true
;
grid[row][col] = UNASSIGNED;
}
}
return
false
;
}
int
main()
{
int
grid[N][M] = { { 0, -1, -1, 0 },
{ -1, -1, -1, -1 },
{ 0, -1, -1, 0 } };
if
(Solve(grid) ==
true
)
printGrid(grid);
else
cout <<
"Not possible"
;
return
0;
}