Pagini recente » Cod sursa (job #3135207) | Cod sursa (job #1975830) | Cod sursa (job #345315) | Cod sursa (job #1757793) | Cod sursa (job #441361)
Cod sursa(job #441361)
#include<stdio.h>
#include<stdlib.h>
void read(char* file_name, int *n, int ***a) { //functie de citire
int i, j;
FILE *fd = fopen(file_name, "r");
// dimensiune matrice
fscanf(fd, "%i", n);
// elementele matricei A
*a = (int**)malloc((*n) * sizeof(int*));
for (i = 0; i < *n; i++) {
(*a)[i] = (int*)malloc((*n) * sizeof(int));
for (j = 0; j < *n; j++) {
fscanf(fd, "%i", &((*a)[i][j]));
}
}
fclose(fd);
}
void write(FILE* fd, int n, int **a){ //functie de scriere
int i,j;
int max = 1;
int contor = 0;
for(i = 0; i < n; i++)
for(j = 0; j < n; j++){
if(a[i][j] > max){
max = a[i][j]; // schimbam maximul
contor = 0; // resetam contorul
}
if(a[i][j] == max)
contor = contor + 1;
}
fprintf(fd, "%i %i\n", max, contor);
}
int min(int a, int b, int c){
if (a < b)
if (a < c)
return a;
else
return c;
else
if (b < c)
return b;
else
return c;
}
int min2(int a, int b, int c, int d){
int v[4];v[0]=a;v[1]=b;v[2]=c;v[3]=d;
int i,aux;
int schimb;
do{
schimb=0;
for(i=1;i<4;i++)
if(v[i]<v[i-1]){
aux=v[i-1];
v[i-1]=v[i];
v[i]=aux;
schimb = 1;
}
}while(schimb);
return v[0];
}
int contains(int k,int **matrix,int N){
int i,j;
for (i = 0; i < N; i++)
for (j = 1; j < N; j++)
if(matrix[i][j] == k)
return 1;
return 0;
}
int main(){
int i = 0, j = 0;
int N;
int **matrix = NULL;
char* in_file = "figuri2.in";
char* out_file = "figuri2.out";
read(in_file, &N, &matrix);
FILE *fout = fopen(out_file, "w"); //fisierul de iesire
//pt patrat
int **aux;
aux = (int**)malloc(N * sizeof(int*));
for (i = 0; i < N; i++)
aux[i] = (int*)malloc(N * sizeof(int)); //construim o matrice auxiliara care va tine evidenta laturilor maxime ale
//patratelor,unde aux[i][j] va fi varful din dreapta jos al patratului de latura aux[i][j]
for (i = 0, j = 0; j < N; j++) aux[i][j] = matrix[i][j]; //copiem prima linie
for (i = 1, j = 0; i < N; i++) aux[i][j] = matrix[i][j]; //copiem prima coloana
for (i = 1; i < N; i++)
for (j = 1; j < N; j++)
if (matrix[i][j] == 0)
aux[i][j] = 0;
else
aux[i][j] = min(aux[i-1][j], aux[i-1][j-1], aux[i][j-1]) + 1;
write(fout, N, aux);
//pt romb
int **aux2;
aux2 = (int**)malloc(N * sizeof(int*));
for (i = 0; i < N; i++) {
aux2[i] = (int*)malloc(N * sizeof(int));
for (j = 0; j < N; j++)
aux2[i][j]=matrix[i][j]; //construiesc o noua matrice auxiliara pt romb,initial are valoarea lui matrix
}
int k=1;
do{ //verific daca o pozitie oarecare din interiorul matricii poate fi un romb
for (i = 1; i < N-1;i++) //ciclul do while se parcurge ori de cate ori se mareste raza unui romb,adica
for (j = 1; j < N-1; j++) //se gaseste unul mai mare
if (aux2[i][j] == 0)
aux2[i][j] = 0;
else
aux2[i][j] = min2(aux2[i-1][j], aux2[i][j-1], aux2[i+1][j], aux2[i][j+1]) + 1;
k++;
}while(contains(k,aux2,N));
write(fout, N, aux2);
return 1;
}