using System.Collections.Generic;
public static void Main()
char[,] expectedOut1 = Tokenize(
char[,] actualOut1 = FlandersFields(in1);
Print("expected", expectedOut1);
Print("actual", actualOut1);
private static char[,] Tokenize(string s)
IEnumerable<string> lines = s.Split(Environment.NewLine).Select(l => l.Trim());
IEnumerable<char[]> chars = lines.Select(l => l.ToCharArray());
char[,] cc = new char[lines.Count(), chars.First().Count()];
for (int ii = 0; ii < lines.Count(); ii++)
for (int jj = 0; jj < chars.First().Count(); jj++)
cc[ii, jj] = chars.ElementAt(ii)[jj];
private static void Print(string caption, char[,] cc)
Console.WriteLine(caption);
for (int ii = 0; ii < cc.GetLength(0); ii++)
for (int jj = 0; jj < cc.GetLength(1); jj++)
Console.Write(cc[ii,jj]);
private static void Log(string log)
private static void Log(string caption, Dictionary<int, HashSet<int>> d)
Console.Write($"{caption} {kvp.Key} -> ");
foreach(var item in kvp.Value)
private static char[,] FlandersFields(char[,] input)
var rows = new Dictionary<int, List<int>>();
var cols = new Dictionary<int, List<int>>();
for (int ii = 0; ii < input.GetLength(0); ii++)
for (int jj = 0; jj < input.GetLength(1); jj++)
rows[ii] = new List<int>();
cols[jj] = new List<int>();
Log($"row {ii} -> {jj}");
Log($"col {jj} -> {ii}");
for (int ii = 0; ii < input.GetLength(0); ii++)
for (int jj = 0; jj < input.GetLength(1); jj++)
if (rows[ii].Any(r => r < jj) && rows[ii].Any(r => r > jj))
Log($"[{ii},{jj}] -> * because rows");
else if (cols[jj].Any(c => c < ii) && cols[jj].Any(c => c > ii))
Log($"[{ii},{jj}] -> * because cols");