2898 - Nave

De la Universitas MediaWiki

Echipajul navei Enterprise, a descoperit pe planeta Marte, zona în care sunt amplasate b baze militare care adăpostesc navele de luptă ale marțienilor. Echipajul navei a reușit să cartografieze zona și a împărțit harta planetei în n x m zone de latură 1, dispuse pe n linii (numerotate de sus în jos de la 1 la n) și m coloane (numerotate de la stânga la dreapta de la 1 la m). Astfel fiecare zonă poate fi identificată prin numărul liniei și al coloanei pe care se află. În fiecare astfel de zonă se află o bază a marțienilor ce adăpostește un număr de nave. Căpitanul navei Enterprise, Jean-Luc Picard a elaborat o strategie de atac terestru a acestor baze militare.

Nava Enterprise poate ateriza într-o zonă în care nu se află o bază marțiană și poate lansa un singur atac (deoarece după primul atac bazele marțiene își vor activa scuturile de protecție). La un atac se vor emite simultan 2 raze laser care vor distruge toate navele marțiene existente în bazele aflate pe direcția acestor raze, în ambele sensuri. Razele sunt emise din centrul zonei în care a aterizat Enterprise și fac unghiuri de 45o, respectiv 135o cu linia pe care se află Enterprise.

Cerința

Scrieți un program care, cunoscând configurația bazelor marțiene, determină numărul maxim de nave marțiene pe care Enterprise le poate distruge la un singur atac, precum și linia și coloana zonei în care poate ateriza nava Enterprise astfel încât să distrugă un număr maxim de nave; dacă există mai multe zone în care poate ateriza convenabil pentru Enterprise este să aleagă zona pentru care linia este maximă; dacă există mai multe zone pe linia maximă, se va alege cea pentru care coloana este maximă.

Date de intrare

Fișierul de intrare nave.in conține pe prima linie trei numere naturale n, m și b, separate prin câte un spațiu, reprezentând numărul de linii, numărul de coloane ale hărții planetei Marte, respectiv numărul de baze marțiene. Pe fiecare dintre următoarele b linii este descrisă câte o bază marțiană sub forma a trei numere naturale separate prin câte un spațiu lin col nr, reprezentând linia și coloana pe care se află baza marțiană, respectiv numărul de nave aflate în baza marțiană respectivă.

Date de ieșire

Fișierul de ieșire nave.out va conține pe prima linie trei numere naturale nrmax, linmax, colmax, separate prin câte un spațiu, reprezentând numărul maxim de nave marțiene pe care Enterprise le poate distruge la un singur atac, precum și linia și coloana zonei în care poate ateriza nava Enterprise astfel încât să distrugă un număr maxim de nave; dacă există mai multe zone în care poate ateriza convenabil pentru Enterprise este să aleagă zona pentru care linia este maximă; dacă există mai multe zone pe linia maximă, se va alege cea pentru care coloana este maximă.

Restricții și precizări

  • 1 ≤ n, m ≤ 100
  • n x m ≤ b2
  • b ≤ n * m / 2
  • 1 ≤ lin ≤ n; 1 ≤ col ≤ m; 1 ≤ nr ≤ 1000

Exemplu:

nave.in

5 4 9
1 1 3
1 2 5
2 2 7
2 4 9
3 1 6
3 3 8 
4 1 1 
5 1 4
5 3 2

nave.out

29 4 2

Explicație

Harta zonei unde se găsesc bazele marțiene este:

Dacă nava Enterprise aterizează în zona situată pe linia 4 și coloana 2, va distruge un număr maxim de nave (29).

def read_input():
    n, m = map(int, input().split())
    harta = []
    for _ in range(n):
        linie = list(map(int, input().split()))
        harta.append(linie)
    return n, m, harta

def calculeaza_sume_diagonale(n, m, harta):
    diag1 = [[0] * m for _ in range(n)]
    diag2 = [[0] * m for _ in range(n)]
    
    # Sume diagonale 45° (/)
    for i in range(n):
        for j in range(m):
            if i > 0 and j > 0:
                diag1[i][j] = harta[i][j] + diag1[i-1][j-1]
            else:
                diag1[i][j] = harta[i][j]

    # Sume diagonale 135° (\)
    for i in range(n):
        for j in range(m):
            if i > 0 and j < m - 1:
                diag2[i][j] = harta[i][j] + diag2[i-1][j+1]
            else:
                diag2[i][j] = harta[i][j]

    return diag1, diag2

def gaseste_punct_optim(n, m, harta, diag1, diag2):
    max_nave = 0
    coordonate_optime = (-1, -1)
    
    for i in range(n):
        for j in range(m):
            if harta[i][j] == 0:  # Poate ateriza doar într-o zonă fără bază marțiană
                suma_nave = 0
                if i > 0 and j > 0:
                    suma_nave += diag1[i-1][j-1]
                if i > 0 and j < m - 1:
                    suma_nave += diag2[i-1][j+1]
                
                if suma_nave > max_nave:
                    max_nave = suma_nave
                    coordonate_optime = (i + 1, j + 1)
                elif suma_nave == max_nave:
                    if i + 1 > coordonate_optime[0] or (i + 1 == coordonate_optime[0] and j + 1 > coordonate_optime[1]):
                        coordonate_optime = (i + 1, j + 1)

    return max_nave, coordonate_optime

def main():
    n, m, harta = read_input()
    diag1, diag2 = calculeaza_sume_diagonale(n, m, harta)
    max_nave, coordonate_optime = gaseste_punct_optim(n, m, harta, diag1, diag2)
    
    print(max_nave)
    print(coordonate_optime[0], coordonate_optime[1])

# Apelare funcție principală
if __name__ == "__main__":
    main()