private static void Main(string[] args) { int numTestCases = int.Parse(Console.ReadLine()); for (int testCaseNum = 0; testCaseNum < numTestCases; testCaseNum++) { var ints = GetSplitInts(); int cols = ints[0]; int rows = ints[1]; notComputable = false; Dictionary<string, Node> nodesReference = new Dictionary<string, Node>(); List<Node> computedNodesList = new List<Node>(); List<Node> allNodes = new List<Node>(); for (int rowNumber = 1; rowNumber <= rows; rowNumber++) { string[] rowSplit = Console.ReadLine().Split(' '); for (int colNumber = 1; colNumber <= cols; colNumber++) { string columName = GetColumnName(colNumber); Node node = new Node(); node.Name = columName + rowNumber; node.Value = rowSplit[colNumber - 1]; nodesReference.Add(node.Name, node); if (node.IsComputed()) computedNodesList.Add(node); allNodes.Add(node); } } //add the adjacent nodes foreach (Node node in computedNodesList) { var references = node.Value.Replace("=", "").Split('+'); foreach (var reference in references) node.ReferencedNodes.Add(nodesReference[reference]); } Console.WriteLine((testCaseNum + 1) + ":"); //compute all the computed nodes ComputeReferences(allNodes); if (notComputable) continue; for (int i = 0; i < allNodes.Count; i++) { Console.Write(allNodes[i].Value + " "); if (i % cols == cols - 1) Console.WriteLine(); } } }