Salve, sto cercando di risolvere fractal ma non riesco a ottenere più di 95/100, in un solo test case l’esecuzione supera il tempo limite.
Sostanzialmente ho due matrici, una per il modello e una che conterrà il disegno finale da stampare. Ogni volta analizzo la matrice e a seconda di se trovo un punto o un asterisco piazzo un modello o un quadro di asterischi nella posizione corretta all’interno della matrice stessa.
Ho provato in vari modi a ottimizzare il codice rendendolo quasi illeggibile… prima ho provato a velocizzare l’I/O con le funzioni unlocked, poi ho trasformato le matrici in array per risparmiare iterazioni.
Qualcuno può aiutarmi?
#include <stdio.h>
#include <math.h>
#include <string.h>
int main() {
FILE *fin = fopen("input.txt", "rb");
// Acquisizione N e K
int N=0, K=0, MAXN;
char read;
read=fgetc_unlocked(fin);
do {
N=(N<<3)+(N<<1)+(read-'0');
read=fgetc_unlocked(fin);
} while(read>='0'&&read<='9');
read=fgetc_unlocked(fin);
do {
K=(K<<3)+(K<<1)+(read-'0');
read=fgetc_unlocked(fin);
} while(read>='0'&&read<='9');
MAXN = pow(N, K);
// Acquisizione modello e inizializzazione matrice finale
char model[N*N], matrix[MAXN*(MAXN+1)];
int r, c, i, n;
for(r=0; r<MAXN; r++) {
matrix[r*(MAXN+1)+MAXN] = '\n';
}
for(r=0; r<N; r++) {
fread_unlocked(&model[r*N], N, 1, fin);
memcpy(&matrix[r*(MAXN+1)], &model[r*N], N);
fgetc_unlocked(fin);
}
fclose(fin);
// Calcolo matrice finale
for(n=N; n!=MAXN; n*=N) {
for(r=n-1; r>=0; r--) {
for(c=n-1; c>=0; c--) {
if(matrix[r*(MAXN+1)+c] == '.') {
for(i=0; i<N; i++) {
memcpy(&matrix[(r*N+i)*(MAXN+1)+c*N], &model[i*N], N);
}
} else {
for(i=0; i<N; i++) {
memset(&matrix[(r*N+i)*(MAXN+1)+c*N], '*', N);
}
}
}
}
}
// Stampa
FILE *fout = fopen("output.txt", "wb");
fwrite_unlocked(matrix, MAXN+1, MAXN, fout);
fclose(fout);
return 0;
}