using
System;
using
System.Collections.Generic;
class
Program
{
static
int
N = 2;
public
static
bool
issafe(
int
[,] sudoku,
int
i,
int
j,
int
n,
int
number,
String[,] region)
{
for
(
int
x = 0; x < n; x++)
{
if
(sudoku[x, j] == number ||
sudoku[i, x] == number)
{
return
false
;
}
}
String r = region[i, j];
List<
int
[]> q =
new
List<
int
[]>();
q.Add(
new
int
[] { i, j });
bool
[,] visited =
new
bool
[N, N];
visited[i, j] =
true
;
while
(q.Count > 0)
{
int
[] front = q[0];
q.RemoveAt(0);
if
(front[0] + 1 < N &&
region[front[0] + 1, front[1]].Equals(r) &&
!visited[front[0] + 1, front[1]])
{
if
(sudoku[front[0] + 1, front[1]] == number)
{
return
false
;
}
q.Add(
new
int
[] { front[0] + 1, front[1] });
visited[front[0] + 1, front[1]] =
true
;
}
if
(front[0] - 1 >= 0 &&
region[front[0] - 1, front[1]].Equals(r) &&
!visited[front[0] - 1, front[1]])
{
if
(sudoku[front[0] - 1, front[1]] == number)
{
return
false
;
}
q.Add(
new
int
[] { front[0] - 1, front[1] });
visited[front[0] - 1, front[1]] =
true
;
}
if
(front[1] + 1 < N &&
region[front[0], front[1] + 1].Equals(r) &&
!visited[front[0], front[1] + 1])
{
if
(sudoku[front[0], front[1] + 1] == number)
{
return
false
;
}
q.Add(
new
int
[] { front[0], front[1] + 1 });
visited[front[0], front[1] + 1] =
true
;
}
if
(front[1] - 1 >= 0 &&
region[front[0], front[1] - 1].Equals(r) &&
!visited[front[0], front[1] - 1])
{
if
(sudoku[front[0], front[1] - 1] == number)
{
return
false
;
}
q.Add(
new
int
[] { front[0], front[1] - 1 });
visited[front[0], front[1] - 1] =
true
;
}
}
return
true
;
}
public
static
bool
solveSudoku(
int
[,] sudoku,
int
i,
int
j,
int
n, String[,] region)
{
if
(i == n)
{
for
(
int
a = 0; a < n; a++)
{
for
(
int
b = 0; b < n; b++)
{
Console.Write(sudoku[a, b] +
" "
);
}
Console.WriteLine();
}
return
true
;
}
if
(j == n)
{
return
solveSudoku(sudoku, i + 1, 0, n, region);
}
if
(sudoku[i, j] != 0)
{
return
solveSudoku(sudoku, i, j + 1, n, region);
}
else
{
for
(
int
number = 1; number <= n; number++)
{
if
(issafe(sudoku, i, j, n, number, region))
{
sudoku[i, j] = number;
bool
rest = solveSudoku(sudoku, i, j + 1, n, region);
if
(rest)
{
return
true
;
}
}
}
sudoku[i, j] = 0;
return
false
;
}
}
public
static
void
Main(String[] args)
{
int
[,] sudoku = {
{ 0, 1 },
{ 0, 0 },
};
String[,] region = {
{
"r"
,
"r"
},
{
"b"
,
"b"
},
};
bool
ans = solveSudoku(sudoku, 0, 0, N, region);
if
(!ans)
{
Console.WriteLine(
"-1"
);
}
}
}