Sunteți pe pagina 1din 2

#include<cstdio>

#include<fstream>
using namespace std;
FILE*fin=fopen("ace.in","r");
ofstream fout("ace.out");

int a[1002][1002],n,m,ct,xmax,ymax,k,rez_a;

void mai_mare(int x, int y)


{
//determin tg unghiului pt a determina unghiul maxim
if(x*ymax<y*xmax)
{
xmax=x;
ymax=y;
k++;//numarul de ace vizibile de camera
}
}

int rezolva_1()//verificat ok
{
//NORD
int i,j;
k=2;
xmax=1;
ymax=a[n-1][m];
for(i=n-2,j=2;i>=1;i--,j++)
mai_mare(j,a[i][m]);
//VEST
xmax=1;
ymax=a[n][m-1];
for(i=m-2,j=2;i>=1;i--,j++)
mai_mare(j,a[n][i]);
return k;
}

void rezolva_2()
{
//parcurg matricea din coltul dreapta_jos spre 1,1 si merg pe "diagonale"
int i,j,difx,dify,l,c;
for(i=n-1;i>=1;i--)
for(j=m-1;j>=1;j--)
if(a[i][j]!=-1)
{
xmax=m-j;
ymax=a[i][j];
k++;
difx=n-i;
dify=m-j;
a[i][j]=-1;
for(l=i-difx,c=j-dify;l>=1&&c>=1;l-=difx,c-=dify)
if(a[l][c]!=-1)
{
mai_mare(m-c,a[l][c]);
a[l][c]=-1;
}
}
fout<<k<<'\n';
}
void citire()
{
int i,j;
fscanf(fin,"%d",&ct);
fscanf(fin,"%d",&n);
fscanf(fin,"%d",&m);
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
fscanf(fin,"%d",&a[i][j]);
rez_a=rezolva_1();
if(ct==1)
{
fout<<rez_a<<'\n';
return;
}
rezolva_2();
}

int main()
{
citire();
return 0;
}

S-ar putea să vă placă și