Pagini recente » Cod sursa (job #2794647) | Cod sursa (job #2410342) | Cod sursa (job #3132926) | Cod sursa (job #814630) | Cod sursa (job #254181)
Cod sursa(job #254181)
#include<stdio.h>
#define infile "grendizer.in"
#define outfile "grendizer.out"
#define max_mod 300
int m[max_mod*2+1][max_mod*2+1]; //matricea in care vom salva bombele
int viz[max_mod*2+1][max_mod*2+1]; //matricea in care vom salva bombele
int n,t; //numarul de bombe si de teste
//deoarece matricea are doar coordonate pozitive, trebuie sa refacem coordonatele negative pt pozitiile alocate lor in matrice
int reface_coord(int x)
{
if(x<0) return ((-1)*x+max_mod);
return x;
}
//verifica daca punctul se afla in matrice
int verif(int x)
{
if(x<0||x>max_mod*2) return 0; //nu se afla
return 1; //se afla
}
//returneaza cumarul de bombe care se afla da distanta Mahnattan egala cu r fata de x y
int nr_bombe(int m[max_mod*2+1][max_mod*2+1], int x, int y, int r, int t)
{
if(r>max_mod*2) return 0; //nu poate exista nicio bomba :P
int s=0; //initial nu avem nicio bomba
int i,j,x1,y1,x2,y2,x3,y3,x4,y4;
for(i=x-r,j=y;i<=x;i++,j++)
{
//refacem coordonatele pt toate cele 4 diagonale
x1=reface_coord(i); y1=reface_coord(j);
x2=reface_coord(i); y2=reface_coord(y-(j-y));
x3=reface_coord(x+(x-i)); y3=reface_coord(j);
x4=reface_coord(x+(x-i)); y4=reface_coord(y-(j-y));
//luam fiecare coordonate in parte...daca se incadreaza in matrice.....adaugam numarul de bombe din cutieuta :>
if(verif(x1)&&verif(y1)&&viz[x1][y1]<t) { s+=m[x1][y1]; viz[x1][y1]=t; }
if(verif(x2)&&verif(y2)&&viz[x2][y2]<t) { s+=m[x2][y2]; viz[x2][y2]=t; }
if(verif(x3)&&verif(y3)&&viz[x3][y3]<t) { s+=m[x3][y3]; viz[x3][y3]=t; }
if(verif(x4)&&verif(y4)&&viz[x4][y4]<t) { s+=m[x4][y4]; viz[x4][y4]=t; }
}
return s; //returnam numarul de bombe gasite
}
int main()
{
int i,x,y,r;
freopen(infile,"r",stdin);
freopen(outfile,"w",stdout);
scanf("%d %d",&n,&t); //numarul de bombe si numarul de teste
for(i=1;i<=n;i++)
{
scanf("%d %d",&x,&y); //avem bomba la coordonatele x,y
x=reface_coord(x); y=reface_coord(y); //refacem coordonatele
m[x][y]++; //crestem numarul de bombe din poozitie
}
for(i=1;i<=t;i++) //avem de rezolvat
{
scanf("%d %d %d\n",&x,&y,&r); //trebuie sa vedem cate bombe se afla la distanta r fata de x y
printf("%d\n",nr_bombe(m,x,y,r,i)); //calculam si afisem numarul de bombe
}
fclose(stdin);
fclose(stdout);
return 0;
}