Rezolvare completă PbInfo #1129 Tinta

Alex are o pasiune pentru trasul la țintă. Jucându-se cu numere, visează la o nouă tablă pentru pasiunea sa. Tabla visată este de formă pătrată cu n linii și n coloane, iar numerele, de la 1 la n * n, le poziționează în țintă, ca în imaginea alăturată.

Alex, fiind un foarte bun țintaș, nu nimerește niciodată pe pătrățelele de pe contur. Când țintește o pătrățică din interior, el obține drept punctaj suma valorilor din cele opt pătrățele vecine.

Cerinţă

Cunoscând n numărul de linii și de coloane ale țintei:

a. Ajutați-l pe Alex să construiască ținta visată.
b. Câte punctaje distincte poate să obțină Alex dacă are o singură săgeată?
c. Afișați punctajele distincte găsite.

Date de intrare

Fișierul de intrare tinta.in conține pe prima linie numărul natural n, indicând numărul de linii și de coloane ale țintei.

Date de ieșire

Fișierul de ieșire tinta.out va conține pe primele n linii câte n numere naturale, separate prin câte un spațiu, reprezentând numerele de pe cele n linii ale țintei. Pe linia n+1 se va afișa un singur număr p reprezentând numărul de punctaje distincte. Pe linia n+2 se vor afișa p numere naturale separate prin câte un spațiu și ordonate strict crescător, reprezentând punctajele distincte.

Restricții și precizări

  • 3 ≤ n ≤ 1000
  • Pentru prima cerinţă afişată corect se va acorda 40% din punctaj; pentru a doua cerință se va acorda 20% din punctaj; pentru cea de-a treia cerință se va acorda 40% din punctaj.

Exemplul 1

tinta.in

3

tinta.out

1  2  6  
3  5  7  
4  8  9
1
40

Explicație

Alex poate ținti doar în pătrățelul interior (cel pe care avem 5), deci obține un singur punctaj, iar suma este 40.

Exemplul 2

tinta.in

4

tinta.out

1 2 6 7
3 5 8 13
4 9 12 14
10 11 15 16
3
45 68 91

Explicație

Alex poate ținti doar pătrăţelele 5, 8, 9 sau 12.

Cum e corect?

cout < "As la info"; cout << "As la info"; cout >> "As la info";

Felicitări! Poți mai mult?

Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.

Greșit, dar nu-i bai!

Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.

Rezolvare

Iată rezolvarea de 100 de puncte pentru problema Tinta:

#include <cstdio>
#include<time.h>
int n,i,j,k,u,v,x,y,a[4][1001],b[1001][4],s;

int main()
{
    freopen("tinta.in","r",stdin);
    freopen("tinta.out","w",stdout);
    scanf("%d",&n); // citesc datele de intrare
    // generez matricea

    for(i=1;i<=n;i++)
    {
        for(j=1;j<=n;j++)
        {
            if(i+j<=n+1)
            {
                if((i+j)%2==0) k=(i+j-1)*(i+j-2)/2+j;
                else k=(i+j-1)*(i+j-2)/2+i;
            }
            else
            {
                u=n+1-i;
                v=n+1-j;
                if((i+j)%2==0) k=n*n+1-(u+v-1)*(u+v-2)/2-v;
                else k=n*n+1-(u+v-1)*(u+v-2)/2-u;
            }
            printf("%d ",k);
            if(i<=3 ) a[i][j]=k;
            if(j>=n-2 ) b[i][n+1-j]=k;
        }
        printf("
");
    }

 printf("%d
",2*(n-2)-1);

 for(j=2;j<n;j++)
 { s=0;
     for(i=1;i<=3;i++)
    for(k=j-1;k<=j+1;k++)
   s+=a[i][k];
   printf("%d ",s-a[2][j]);}

   for(i=3;i<n;i++)
   {s=0;
     for(j=1;j<=3;j++)
    for(k=i-1;k<=i+1;k++)
   s+=b[k][j];
   printf("%d ",s-b[i][2]);
   }
        return 0;
}

Atenție

Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa Adresa de email.

Rezolvarea problemei #1129 Tinta

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #1129 Tinta de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.

Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!