Salve a tutti ho un problemino (se si può chimare ino) con un programma...
il testo richeideva:
"Una regione di forma rettangolare di territorio è stata suddivisa in settori quadrati di eguale dimensione e per ognuno di essi è stato valutato il rischio sismico misurato da un opportuno indice di rischio sismico. Quindi, l'intera valutazione è stata sintetizzata in una matrice rettangolare S che per ogni settore di coordinate (i, j) riporta l'indice di rischio sismico S
[j] di quel settore. Una sottoregione formata da uno o più settori contigui ha indice di rischio sismico dato dalla media degli indici dei suoi settori. Si è interessati a determinare la più grande sottoregione costituita da un gruppo contiguo di settori formanti un quadrato o un rettangolo che ha l'indice di rischio sismico non oltre una certa soglia M. Ciò equivale a determinare la più grande sottomatrice della matrice S la cui media dei valori dei suoi elementi non eccede la soglia M. Una sottomatrice è determinata da un insieme di righe e colonne consecutive.
Implementare una funzione int bestsubmatrix(int nr, int nc, double S[nr][nc], double m) che ritorna l'area (cioè il numero di elementi) della più grande sottomatrice quadrata o rettangolare della matrice S (avente nr righe e nc colonne) con indice di rischio sismico non superiore a m. Ecco alcuni esempi di input e output (in grassetto sono evidenziate alcune sottomatrici di massima area):
nr = 6, nc = 8, m = 3.7
6.46 3.36 4.29 3.64 5.97 3.15 5.66 3.20
3.40 6.22 2.44 6.66 5.55 6.83 1.44 7.70
4.73 3.52 5.87 7.52 2.96 7.20 6.24 0.72
3.34 1.65 7.81 3.57 2.25 3.52 0.89 7.02
5.93 2.19 5.87 3.38 7.01 7.73 7.66 4.11
7.72 7.07 7.04 1.66 0.64 2.05 7.84 6.60
La funzione ritorna 9
"
io ho scritto qualcosa ma c'è un problema:
stampa sempre l'area massima (quindi nr*nc) =(
QUESTO è IL CODICE: (grazie in anticipo )
#include <stdio.h>
int bestsubmatrix(int nr, int nc, float S[nr][nc], float m);
int media(int nr, int nc, float S[nr][nc],int pr, int ar,int pc, int ac);
int main () {
int i,j,n,m,c;
scanf("%d %d",&n,&m);
float M[n][m];
float soglia;
for(i=0; i<n;i++) {
for (j=0; j<m;j++) {
scanf("%f",&M[i][j]);
}
}
scanf("%f",&soglia);
c= bestsubmatrix(n,m,M,soglia);
printf("%d",c);
return 0;
}
int bestsubmatrix(int nr, int nc, float S[nr][nc], float m) {
int i,j,righe,colonne,a,b,area=0;
for(i=0;i<nr;i++) {
for(j=0;j<nc;j++) {
for(righe=(nr-1);righe>=i;righe--) {
for (colonne=(nc-1);colonne>=j;colonne--) {
a=(righe-i)+1;
b=(colonne-j)+1;
/*printf("righe=%d; i=%d; colonne=%d; j=%d; ",righe,i,colonne,j);
printf("nr=%d;nc=%d\n",nr,nc);*/
if((media(nr,nc,S,i,righe,j,colonne)<=m)&&((a*b)>area)) {
area=a*b;
}
}
}
}
}
return area;
}
int media(int nr, int nc, float S[nr][nc],int pr, int ar,int pc, int ac) {
int i,j;
float temp=0,media;
for(i=pr;i<=ar;i++) {
for(j=pc;j<=ac;j++) {
temp += S[i][j];
}
}
media=temp/(((ar-pr)+1)*((ac-pc)+1));
return media;
}