#nullable enable using System.Runtime.CompilerServices; #region var (_input, _iter) = (Array.Empty(), 0); T I() where T : IParsable { while (_iter >= _input.Length) (_input, _iter) = (Console.ReadLine()!.Split(' ', StringSplitOptions.RemoveEmptyEntries), 0); return T.Parse(_input[_iter++], null); } #endregion var n = I(); var a = I(); var b = I(); var c = I(); var g = new Grid2(n, n); if (Math.Max(a, Math.Max(b, c)) < n + n) { var q = new Queue<(int, int)>(); for (var i = 0; i < n; i++) { if (b == 0) break; b--; g[i, 0] = 2; q.Enqueue((i, 0)); } for (var j = 1; j < n; j++) { if (b == 0) break; b--; g[0, j] = 2; q.Enqueue((j, 0)); } ReadOnlySpan<(int, int)> moves = [(-1, 0), (0, -1), (0, 1), (1, 0)]; if (a > c) { while (q.Count > 0) { var (i, j) = q.Dequeue(); foreach (var (di, dj) in moves) { var (ni, nj) = (i + di, j + dj); if (g.Inside(ni, nj) && g[ni, nj] == 0) { a--; g[ni, nj] = 1; } } } } else { while (q.Count > 0) { var (i, j) = q.Dequeue(); foreach (var (di, dj) in moves) { var (ni, nj) = (i + di, j + dj); if (g.Inside(ni, nj) && g[ni, nj] == 0) { c--; g[ni, nj] = 3; } } } } } { var nz = new (int, int)[]{ (a, 1), (b, 2), (c, 3) }; Array.Sort(nz); var x = 3; var k = 0; var m = -1; for (var i = 0; i < n; i++) for (var j = 0; j < n; j++) { if (g[i, j] != 0) continue; while (k <= 0) { x--; (k, m) = nz[x]; } k--; g[i, j] = m; } } Console.WriteLine(g.Joined()); partial class Grid2(int _l0, int _l1) { public int L0 => _l0; public int L1 => _l1; readonly T[] _data = new T[_l0 * _l1]; public ref T this[int i, int j] { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => ref _data[i * _l1 + j]; } public void Fill(T value) => _data.AsSpan().Fill(value); public bool Inside(int i, int j) => (uint)i < (uint)_l0 && (uint)j < (uint)_l1; } partial class Grid2 { public ReadOnlySpan Row(int i) => _data.AsSpan(i * _l0, _l1); public string Joined() { var res = new List(); for (var i = 0; i < _l0; i++) res.Add(string.Join("", [.. Row(i)])); return string.Join(Environment.NewLine, res); } }