/************************************************ Grundlegende Algorithmen mit Java, http://algorithmen-und-problemloesungen.de/ Copyright @2007-2009 by Doina Logofatu in C#: Michael Gärtner ************************************************/ using System; using System.Text; using System.IO; namespace Logofatu { class P06QuadTree { private static String FileInputName = "quad.in"; private static String FileOutputName = "quad.out"; private StringBuilder unifiedTree; public P06QuadTree() { this.unifiedTree = new StringBuilder(); } private static bool isLeaf(char c) { return 'e' == c || 'f' == c; } public void unifyTrees(StringBuilder t1, StringBuilder t2) { if ( 'p' == t1[0] && 'p' == t2[0] ) { this.unifiedTree.Append('p'); int i1 = 1, i2 = 1; StringBuilder sr1 = new StringBuilder(); StringBuilder sr2 = new StringBuilder(); for ( int i = 0; i < 4; i++ ) { i1 = subTree(t1, sr1, i1); i2 = subTree(t2, sr2, i2); this.unifyTrees(sr1, sr2); } } else { if ( t1[0] == 'f' || t2[0] == 'f' ) this.unifiedTree.Append('f'); else if ( 'e' == t2[0] ) this.unifiedTree.Append(t1); else if ( 'e' == t1[0] ) this.unifiedTree.Append(t2); } } private static int subTree(StringBuilder ss, StringBuilder sr, int t) { sr.Length = 0; if ( 'p' == ss[t] ) { for ( int n = 1; n != 0 && t < ss.Length;) { if ( isLeaf(ss[t]) ) n--; else n += 3; sr.Append(ss[t++]); } } else { sr.Append(ss[t++]); } return t; } private static int getValue(StringBuilder ss, int v) { if ( 'p' == ss[0] ) { StringBuilder sr = new StringBuilder(); int t = 1; int suma = 0; for ( int i = 0; i < 4; i++ ) { t = subTree(ss, sr, t); suma += getValue(sr, v / 4); } return suma; } else return 'f' == ss[0] ? v : 0; } static void Main(string[] args) { StreamReader sc = null; StreamWriter sw = null; try { sw = new StreamWriter(FileOutputName); sc = new StreamReader(FileInputName); StringBuilder t1, t2; while ( !sc.EndOfStream ) { string[] sArray = sc.ReadLine().Split(' '); t1 = new StringBuilder(sArray[0]); if ( sArray.Length == 2 ) t2 = new StringBuilder(sArray[1]); else t2 = new StringBuilder(sc.ReadLine()); P06QuadTree p6 = new P06QuadTree(); p6.unifyTrees(t1, t2); sw.WriteLine("{0} + {1} = {2}", t1, t2, p6.unifiedTree); sw.WriteLine("{0:d} + {1:d} = {2:d}", getValue(t1, 1024), getValue(t2, 1024), getValue(p6.unifiedTree, 1024)); sw.WriteLine("-------------------------------------"); sc.ReadLine(); } } catch ( IOException ex ) { Console.WriteLine("Fehler bei der Dateiverarbeitung!\n" + ex); } finally { if ( sc != null ) { sc.Close(); } if ( sw != null ) { sw.Close(); } } } } }