I. 328. Kovács Balázs Marcell 11. évf. Budapest, ELTE Radnóti Miklós Gyakorló Iskola alkalmazott fordító: gcc 4.6.3 (Ubuntu/Linaro 4.6.3-4ubuntu5) A figyelmeztetés nélküli fordításhoz a -std=c++0x vagy a -std=gnu++0x kapcsoló szükséges: g++ i328.cpp -std=c++0x -o i328 A program a kifejezések feldolgozásához (feldolgoz() függvény) a shunting-yard algoritmust használja (ennek leírása itt található: http://en.wikipedia.org/wiki/Shunting-yard_algorithm ) Az operátorok deklarálásához használt struktúra ebből a C-implementációból származik: http://en.literateprograms.org/Shunting_yard_algorithm_%28C%29 (magának az algoritmusnak az implementációja saját) A fordított lengyel jelölésre átalakított kifejezést a szamol() függvény dolgozza fel. Ennek bemenete egy 10 elemű tömb, ami tartalmazza az A-J változók behelyettesítési értékeit. A kód ennek az algoritmusnak a saját kezű implementációja: http://en.wikipedia.org/wiki/Reverse_Polish_notation#Postfix_algorithm Az ellentmondások meghatározásának módja a következő: A 10 db. változó összesen 2^10=1024 féle állapotot vehet fel együttesen. Egy állapotnak egy bitet feleltetünk meg (1=lehetséges 0=nem lehetséges) egy 32 elemből álló 32 bites integereket tartalmazó tömbben. Minden egyes sor feldolgozásakor beállítjuk ennek a tömbnek az összes bitjét, ez az összes 1024 eset végignézésével jár. (Az algoritmus nem túl okos, ha egy sorban mondjuk csak 2 féle változó van, akkor is végignézi az összes 1024 esetet, holott elvileg elégséges lenne 4 esetet megnézni. Viszont a tapasztalat szerint így is elég gyors a program, így nem láttam értelmét tovább bonyolítani azt.) Miután ezt megtettük, "hozzáandeljük" a kapott eredményt a korábbi eredményekhez (hiszen minden állításnak egyszerre kell igaznak lennie). Ha a kapott tömb minden eleme (és egyben bitje) 0, akkor ellentmondást találtunk, hiszen semmilyen variáció esetén nem teljesülnek egyszerre a feltételek. Megj.: A feldolgozó algoritmus viszonylag általánosra van véve, az operátorok tulajdonságait egyszerűen át lehet állítani. Itt ezt különböző oldalakon talált információk alapján tettem meg, nem vagyok teljesen meggyőződve arról, hogy tényleg a betáplált-e a helyes műveleti sorrend.