Informatică, întrebare adresată de lilianacamelia75, 8 ani în urmă

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

Răspunsuri la întrebare

Răspuns de boiustef
1

#include <iostream>

#include <fstream>

using namespace std;

ifstream f("nave.in");

ofstream g("nave.out");

int n, m, i, j, v[101][101], linmax, colmax, baze, k , lin, col, nr;

long long s[101][101], nrmax, suma;

int main()

{

  f >> n >> m >> baze;

  for (k=1; k<=baze; ++k)

  {

      f >> lin >> col >> nr;

      v[lin][col]=nr;

  }

  for (i=1; i<=n; ++i)

  {

      for (j=1; j<=m; ++j)

      {

          if (v[i][j]==0)

          {

              suma=0;

              lin=i-1; col=j-1;

              while (lin>0 && col>0)

              {

                  suma=suma+v[lin][col];

                  --lin; --col;

              }

              lin=i-1; col=j+1;

              while (lin>0 && col<=m)

              {

                   suma=suma+v[lin][col];

                  --lin; ++col;

              }

              lin=i+1; col=j+1;

              while (lin<=n && col<=m)

              {

                  suma=suma+v[lin][col];

                  ++lin; ++col;

              }

              lin=i+1; col=j-1;

              while (lin<=n && col>0)

              {

                   suma=suma+v[lin][col];

                   ++lin; --col;

              }

              s[i][j]=suma;

          }

      }

  }

   lin=1; col=1; nrmax=s[1][1];

  for (i=1; i<=n; ++i)

  {

      for (j=1; j<=m; ++j)

      {

          if (s[i][j]>=nrmax)

          {

              nrmax=s[i][j]; lin=i; col=j;

          }

      }

  }

  g << nrmax << " " << lin << " " << col;

}


lilianacamelia75: mersi
Alte întrebări interesante