MODULE Bojenje; FROM IO IMPORT WrStr, WrLn, WrCard; CONST MaxBrojZemalja = 30; DuzinaImena = 18; TYPE RangImena = [1 .. DuzinaImena]; Zemlja = [1 .. MaxBrojZemalja]; SkupZ = SET OF Zemlja; Boja = (Crvena, Plava, Zelena, Zuta); GraniceTip = ARRAY Zemlja OF SkupZ; BojeZemalja = ARRAY Boja OF SkupZ; ImenaZemalja = ARRAY Zemlja, RangImena OF CHAR; VAR Granice: GraniceTip; Obojeno: BojeZemalja; Ime: ImenaZemalja; BrZ: Zemlja; RBr: CARDINAL; PROCEDURE Inicijalizacija; VAR i: Boja; BEGIN FOR i:= MIN(Boja) TO MAX(Boja) DO Obojeno[i]:= SkupZ {}; END; Ime[ 1]:= 'Maroko'; Ime[ 2]:= 'Zapadna Sahara'; Ime[ 3]:= 'Alzir'; Ime[ 4]:= 'Tunis'; Ime[ 5]:= 'Mauritanija'; Ime[ 6]:= 'Mali'; Ime[ 7]:= 'Niger'; Ime[ 8]:= 'Libija'; Ime[ 9]:= 'Senegal'; Ime[10]:= 'Gvineja'; Ime[11]:= 'Obala Slonovace'; Ime[12]:= 'Burkina Faso'; Ime[13]:= 'Benin'; Ime[14]:= 'Nigerija'; Ime[15]:= 'Cad'; Ime[16]:= 'Sudan'; Ime[17]:= 'Egipat'; Ime[18]:= 'Gambija'; Ime[19]:= 'Gvineja Bisao'; Ime[20]:= 'Siera Leone'; Granice[ 1]:= SkupZ {3, 2}; Granice[ 2]:= SkupZ {1, 3, 5}; Granice[ 3]:= SkupZ {1, 2, 5, 6, 7, 8, 4}; Granice[ 4]:= SkupZ {3, 8}; Granice[ 5]:= SkupZ {2, 3, 6, 9}; Granice[ 6]:= SkupZ {3, 5, 9, 10, 11, 12, 7}; Granice[ 7]:= SkupZ {3, 6, 12, 13, 14, 15, 8}; Granice[ 8]:= SkupZ {4, 3, 7, 15, 16, 17}; Granice[ 9]:= SkupZ {18, 19, 10, 6, 5}; Granice[10]:= SkupZ {19, 9, 6, 20, 11}; Granice[11]:= SkupZ {10, 6, 12}; Granice[12]:= SkupZ {6, 11, 13, 7}; Granice[13]:= SkupZ {12, 7, 14}; Granice[14]:= SkupZ {13, 7, 15}; Granice[15]:= SkupZ {14, 7, 8, 16}; Granice[16]:= SkupZ {17, 8, 15}; Granice[17]:= SkupZ {8, 15, 16}; Granice[18]:= SkupZ {9}; Granice[19]:= SkupZ {9, 10}; Granice[20]:= SkupZ {10}; RBr:= 0; BrZ:= 20 END Inicijalizacija; PROCEDURE StampajSkup(VAR S: SkupZ); VAR z: Zemlja; Prvi: BOOLEAN; BEGIN Prvi:= TRUE; FOR z:= 1 TO MaxBrojZemalja DO IF z IN S THEN IF Prvi THEN WrStr(Ime[z]); Prvi:= FALSE; ELSE WrStr(', '); WrStr(Ime[z]); END; END; END; END StampajSkup; PROCEDURE Stampa(RBr: CARDINAL; VAR Obojeno: BojeZemalja); BEGIN WrLn; WrLn; WrCard(RBr, 1); WrLn; WrStr('Crvena: '); StampajSkup(Obojeno[Crvena]); WrLn; WrStr('Plava: '); StampajSkup(Obojeno[Plava]); WrLn; WrStr('Zelena: '); StampajSkup(Obojeno[Zelena]); WrLn; WrStr('Zuta: '); StampajSkup(Obojeno[Zuta]); END Stampa; PROCEDURE Oboji(z: Zemlja); VAR i: Boja; BEGIN FOR i:= MIN(Boja) TO MAX(Boja) DO IF Granice[z] * Obojeno[i] = SkupZ {} THEN Obojeno[i]:= Obojeno[i] + SkupZ {z}; IF z = BrZ THEN INC(RBr); Stampa(RBr, Obojeno); ELSE Oboji(z + 1); END; Obojeno[i]:= Obojeno[i] - SkupZ {z}; END; END; END Oboji; BEGIN Inicijalizacija; Oboji(1); (* Broj mogucih bojenja je 1 527 552 *) END Bojenje.