0604 - Maria

De la Universitas MediaWiki
Versiunea pentru tipărire nu mai este suportată și poate avea erori de randare. Vă rugăm să vă actualizați bookmarkurile browserului și să folosiți funcția implicită de tipărire a browserului.

Cerința

Maria dansează! Lecțiile de dans se desfășoară într-o sală imensă, împărțită în n*m sectoare pătratice cu dimensiunea 1, dispuse pe n linii și m coloane. În anumite sectoare se află diverse obstacole, astfel că acele sectoare nu pot fi utilizate pentru dans. Maria are nevoie pentru dans de o zonă dreptunghiulară de dimensiuni p, q, cu laturile paralele cu pereții sălii, care să nu conțină obstacole și vrea ca în fiecare zi să danseze într-o zonă diferită de cele în care a dansat deja. Determinați numărul de zile în care Maria poate dansa așa cum își dorește.

Date de intrare

Fișierul de intrare mariain.txt conține pe prima linie numerele n m p q. A doua linie conține numărul k de sectoare din sală în care se află obstacole. Fiecare dintre următoarele k linii conține două numere i j, reprezentând linia și coloana unui sector ce conține un obstacol.

Date de ieșire

Fișierul de ieșire mariaout.txt va conține pe prima linie numărul Z de zile în care Maria poate dansa în zone diferite.

Restricții și precizări

  • 1 ⩽ n, m, p, q ⩽ 1000
  • 0 ⩽ k ⩽ 1000
  • 1 ⩽ i ⩽ n, 1 ⩽ j ⩽ m
  • două zone de dans sunt distincte dacă diferă prin cel puțin un sector
  • zona de dans poate fi orientată astfel încât să ocupe p linii și q coloane sau q linii și p coloane

Exemplu 1

mariain.txt
5 6 2 3
3
2 2
3 5
4 3
mariaout.txt
5


Exemplu 2

mariain.txt
0 -1 -2 0
-1
-3 -4
mariaout.txt
Nu au fost respectate cerintele impuse


Rezolvare

#0604 - Maria
def is_valid_input(n, m, p, q, obstacles):
    if not (1 <= n <= 1000 and 1 <= m <= 1000 and 1 <= p <= 1000 and 1 <= q <= 1000):
        return False

    if not (0 <= len(obstacles) <= 1000):
        return False

    for i, j in obstacles:
        if not (1 <= i <= n and 1 <= j <= m):
            return False

    return True

def count_dance_days(n, m, p, q, obstacles):
    dance_days = 0

    for i in range(1, n - p + 2):
        for j in range(1, m - q + 2):
            valid_dance_zone = True

            for k in range(p):
                for l in range(q):
                    if (i + k, j + l) in obstacles:
                        valid_dance_zone = False
                        break

                if not valid_dance_zone:
                    break

            if valid_dance_zone:
                dance_days += 1

    for i in range(1, n - q + 2):
        for j in range(1, m - p + 2):
            valid_dance_zone = True

            for k in range(q):
                for l in range(p):
                    if (i + k, j + l) in obstacles:
                        valid_dance_zone = False
                        break

                if not valid_dance_zone:
                    break

            if valid_dance_zone:
                dance_days += 1

    return dance_days

def main():
    try:
        with open("mariain.txt", "r") as infile:
            n, m, p, q = map(int, infile.readline().split())
            k = int(infile.readline())
            obstacles = [tuple(map(int, infile.readline().split())) for _ in range(k)]
    except ValueError:
        print("Nu au fost respectate cerintele impuse.")
        return

    if not is_valid_input(n, m, p, q, obstacles):
        print("Nu au fost respectate cerintele impuse.")
        return

    result = count_dance_days(n, m, p, q, obstacles)

    with open("mariaout.txt", "w") as outfile:
        outfile.write(str(result))

if __name__ == "__main__":
    main()