Recherche du plus grand 2×2 “carré” de valeurs dans le tableau C

Pour mon affectation, je dois prendre un tableau de valeurs, les sauvegarder dans un deuxième tableau et imprimer un “carré” des 4 valeurs les plus élevées. Cela signifie le “carré” pour lequel la sum de ses éléments est la plus grande du tableau.

Example: Given the array 1 2 3 4 5 6 7 8 9 10 11 12 the output should be 7 8 11 12 

À l’origine, j’essayais d’utiliser des ensembles de boucles for nestedes pour rechercher et stocker chacune des valeurs les plus grandes suivantes dans le second tableau, mais je n’arrive pas à comprendre le bon algorithme. Ce que j’ai jusqu’ici me donne juste la même valeur (dans le cas de cet exemple, 12). De plus, je me suis rendu compte que cette façon ne me permettrait pas de garder le même formatage dans le second tableau.

Ce que je veux dire, c’est que si je sauvegarde le plus grand nombre trouvé dans le tableau b [0] [0], il se trouvera au mauvais endroit et mon carré sera éteint, ressemblant à quelque chose comme:

 12 11 10 9 

Voici ce que j’ai jusqu’à présent:

 int main(){ int og[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}, new[2][2]={}, rows; int columns, i, high,j,high2,high3,high4; high = new[i][0]; high2= high - 1; high3= high2 - 1; high4= high3 - 1; rows = 3; columns = 4; for (i=0; i<=rows; i++){ for(j=0; j<=columns; j++){ if (high < og[j][i]) high = og[j][i]; } } for(i=1;i<=rows;i++){ for(j=1;j<=columns;j++){ if(high2 < og[j][i]) high2= og[j][i]; } } printf("max = %d, %d\n", high, high2); //return high; system("pause"); return 0; 

    La logique devrait ressembler à peu près à ce qui suit (je ne dispose pas d’un atm du compilateur pour le tester, donc laissez-moi savoir dans les commentaires si j’ai fait une erreur négligeable):

     int i = 0; int j = 0; int max = 0; int sum = 0; int i_saved = 0; int j_saved = 0; for(i = 0; i < rows - 1; i++){ for(j =0; j < columns -1; j++){ sum = og[i][j] + og[i][j+1] + og[i+1][j] + og[i+1][j+1]; //sum the square if (sum > max){ max = sum; i_saved = i; j_saved = j; } } } 

    Puisque OP demande les valeurs utilisées pour sauvegarder dans un autre tableau, il ne vous rest plus qu’à récupérer les valeurs! Nous avons déjà enregistré les index, cela devrait donc être relativement sortingvial.

     int [][] arr = [2][2]; arr[0][0] = og[i_saved][j_saved]; arr[0][1] = og[i_saved][j_saved+1]; arr[1][0] = og[i_saved+1][j_saved]; arr[1][1] = og[i_saved+1][j_saved+1]; 

    De la même manière que nous les avons résumées, nous pouvons également utiliser ce schéma logique pour les extraire!

    J’ai créé cette solution:

     #include  #include  using namespace std; int main() { int Mat[3][4]={{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}}; int maximum = 0; int Max_2x2[2][2] = {{1, 2}, {5, 6}}; for(int i = 0; i < 2; i++) { for(int j = 0; j < 3; j++) { maximum = max(Mat[i][j]+Mat[i][j+1]+Mat[i+1][j]+Mat[i+1][j+1], maximum); if(maximum == Mat[i][j]+Mat[i][j+1]+Mat[i+1][j]+Mat[i+1][j+1]) { Max_2x2[0][0] = Mat[i][j]; Max_2x2[0][1] = Mat[i][j+1]; Max_2x2[1][0] = Mat[i+1][j]; Max_2x2[1][1] = Mat[i+1][j+1]; } } } cout << maximum << endl; for(int i = 0; i < 2; i++) { for(int j = 0; j < 2; j++) { cout << Max_2x2[i][j] << " "; } cout << endl; } return 0; } 

    ce qui donne la sortie suivante:

     38 // maximum solution 7 8 // output array 11 12 

    Ce n'est évidemment pas une solution générale , mais cela fonctionne pour votre exemple.

     int new[2][2]={} 

    Je ne suis pas sûr que cela soit valide. Vous devrez peut-être spécifier une valeur 0 pour chaque cellule. Même si ce n’est pas obligatoire, c’est une bonne pratique.

     high = new[i][0]; 

    Je ne vois pas où i été initialisé.