public class Sali { private Elokuva elokuva; private boolean[][] paikat; public Sali(int rivienMaara, int paikkojaRivilla) { this.paikat = new boolean[rivienMaara][paikkojaRivilla]; } public boolean varaaPaikka(int rivi, int paikkaRivilla) { if(this.elokuva == null) return false; if (this.paikat[rivi-1][paikkaRivilla-1] == false) { this.paikat[rivi-1][paikkaRivilla-1] = true; return true; } else return false; } public boolean onkoVarattu(int rivi, int paikkaRivilla) { if (this.paikat[rivi - 1][paikkaRivilla - 1] == true) return true; else return false; } public boolean varaaRyhmanPaikat(int ryhmanKoko) { int varausrivi = 0, i, vierekkaisetVapaat = 0, j, merkki = 0, k; boolean apumuuttuja = false; int paikatRivilla = this.kerroPaikkojenMaaraRivilla(); int rivit = this.kerroRivienMaara(); if(this.elokuva == null || ryhmanKoko > paikatRivilla) return false; if (rivit % 2 == 0) varausrivi = rivit / 2; else varausrivi = (rivit + 1) / 2 - 1; for (j = 0; j < rivit; j++) { if (apumuuttuja == false) { for(i = 0; i < paikatRivilla; i++) { if(this.onkoVarattu(varausrivi + 1, i + 1) == false) { vierekkaisetVapaat++; if (vierekkaisetVapaat == ryhmanKoko) { merkki = i; apumuuttuja = true; } } else vierekkaisetVapaat = 0; } } else if (vierekkaisetVapaat < ryhmanKoko) { if ((j + 1) % 2 == 0) { if (varausrivi < rivit) { varausrivi += (j + 1); i = 0; } } else if (varausrivi - (j + 1) > 0) { varausrivi -= (j + 1); i = 0; } else if (varausrivi == rivit - 1) { varausrivi = 0; i = 0; } else if (varausrivi - (j + 1) == -1) { varausrivi = rivit - 1; i = 0; } } else for(k = 0; k < ryhmanKoko; k++) { this.paikat[varausrivi][merkki - k] = true; } } return true; } public void asetaElokuva(Elokuva elokuva) { this.elokuva = elokuva; } public boolean poistaElokuva() { if (this.elokuva != null) { this.elokuva = null; return true; } else return false; } public Elokuva kerroElokuva() { return this.elokuva; } public int kerroRivienMaara() { return this.paikat.length; } public int kerroPaikkojenMaaraRivilla() { return this.paikat[0].length; } public int kerroVapaidenPaikkojenMaara() { int i, j, vapaat = 0; for (j = 0; j < this.paikat.length; j++) { for (i = 0; i < this.paikat[0].length; i++) { if (this.paikat[j][i] == false) vapaat++; } } return vapaat; } public int kerroPaikkojenKokonaismaara() { int kokonaismaara; kokonaismaara = this.paikat.length * this.paikat[0].length; return kokonaismaara; } }