using
System;
using
System.Collections;
using
System.Collections.Generic;
using
System.Linq;
class
GFG {
public
static
void
display_matrix(
int
[,] A,
int
N,
int
M)
{
for
(
int
i = 0; i < N; i++){
for
(
int
j = 0; j < M; j++){
Console.Write(A[i, j] +
" "
);
}
Console.WriteLine();
}
}
public
static
void
cal_main(
int
[,] A,
int
L, HashSet<
int
> x,
int
i,
int
j,
int
N,
int
M)
{
HashSet<
int
> s =
new
HashSet<
int
>();
if
((i - 2) >= 0)
s.Add(A[i - 2,j]);
if
((i + 2) < N)
s.Add(A[i + 2,j]);
if
((j - 2) >= 0)
s.Add(A[i,j - 2]);
if
((j + 2) < M)
s.Add(A[i,j + 2]);
if
((i - 1) >= 0 && (j - 1) >= 0)
s.Add(A[i - 1,j - 1]);
if
((i - 1) >= 0 && (j + 1) < M)
s.Add(A[i - 1,j + 1]);
if
((i + 1) < N && (j - 1) >= 0)
s.Add(A[i + 1,j - 1]);
if
((i + 1) < N && (j + 1) < M)
s.Add(A[i + 1,j + 1]);
if
(s.Contains(0))
s.Remove(0);
if
(s.Count < L)
{
HashSet<
int
> w =
new
HashSet<
int
>();
foreach
(
var
num
in
x) {
if
(!x.Contains(num)){
w.Add(num);
}
}
A[i,j] = w.Max();
}
else
{
A[i,j] = L + 1;
L += 1;
x.Add(L);
}
}
public
static
void
solve(
int
N,
int
M)
{
int
[,] A =
new
int
[N, M];
for
(
int
i = 0; i < N; i++){
for
(
int
j = 0; j < M; j++){
A[i,j] = 0;
}
}
HashSet<
int
> x =
new
HashSet<
int
>();
int
L = 0;
if
(N < 4 || M < 4)
{
if
(N > M)
for
(
int
i = 0; i < N; i++)
for
(
int
j = 0; j < N; j++)
cal_main(A, L, x, i, j, N, M);
else
{
for
(
int
i = 0; i < N; i++)
for
(
int
j = 0; j < N; j++)
cal_main(A, L, x, i, j, N, M);
}
}
else
{
L = 4;
int
[,] m4 = {{1, 2, 3, 4},
{1, 2, 3, 4},
{3, 4, 1, 2},
{3, 4, 1, 2}};
for
(
int
i = 0; i < 4; i++)
for
(
int
j = 0; j < 4; j++)
A[i,j] = m4[i,j];
for
(
int
i = 4; i < N; i++)
for
(
int
j = 0; j < 4; j++)
A[i,j] = m4[i % 4,j];
for
(
int
j = 4; j < M; j++)
for
(
int
i = 0; i < N; i++)
A[i,j] = A[i,j % 4];
}
Console.WriteLine(L);
display_matrix(A, N, M);
}
static
void
Main() {
int
N = 10;
int
M = 5;
solve(N, M);
}
}