magisches Quadrat der Ordnung n ?

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • magisches Quadrat der Ordnung n ?

    Ich habe im Internet gesucht. Und es ist mehr in Beziehung mit Mathematik. Kann jemand mir hier helfen:

    Ein magisches Quadrat der Ordnung n enthält die Zahlen von 1 bis n^2 so, dass die Summe der Zahlen in jeder Zeile, Spalte und Diagonale gleich groß ist. Ein Beispiel für ein Quadrat der Ordnung 4 (alle Summen sind gleich 34):
    16 2 3 13
    5 11 10 8
    9 7 6 12
    4 14 15 1
    Schreiben Sie ein Programm, das für eine vorgegebene Ordnung (max. 6) die magischen Quadrate ermittelt und ausgibt.
    ---

    Wie?
  • ich habe gefunden, noch kann jemand mir es ein bischen erklaeren:

    Quellcode

    1. #include "stdafx.h"
    2. #include <vector>
    3. using namespace std;
    4. void OddMagicSquare(vector<vector<int> > &matrix, int n);
    5. void DoublyEvenMagicSquare(vector<vector<int> > &matrix, int n);
    6. void SinglyEvenMagicSquare(vector<vector<int> > &matrix, int n);
    7. void MagicSquare(vector<vector<int> > &matrix, int n);
    8. void PrintMagicSquare(vector<vector<int> > &matrix, int n);
    9. int main(int argc, char* argv[])
    10. {
    11. int n;
    12. printf("Enter order of square: ");
    13. scanf("%d", &n);
    14. vector<vector<int> > matrix(n, vector<int> (n, 0));
    15. if (n<3)
    16. {
    17. printf("\nError: n must be greater than 2\n\n");
    18. return -1;
    19. }
    20. MagicSquare(matrix, n);
    21. //Print results
    22. PrintMagicSquare(matrix, n);
    23. return 0;
    24. }
    25. void MagicSquare(vector<vector<int> > &matrix,int n)
    26. {
    27. if (n%2==1) //n is Odd
    28. OddMagicSquare(matrix, n);
    29. else //n is even
    30. if (n%4==0) //doubly even order
    31. DoublyEvenMagicSquare(matrix, n);
    32. else //singly even order
    33. SinglyEvenMagicSquare(matrix, n);
    34. }
    35. void OddMagicSquare(vector<vector<int> > &matrix, int n)
    36. {
    37. int nsqr = n * n;
    38. int i=0, j=n/2; // start position
    39. for (int k=1; k<=nsqr; ++k)
    40. {
    41. matrix[i][j] = k;
    42. i--;
    43. j++;
    44. if (k%n == 0)
    45. {
    46. i += 2;
    47. --j;
    48. }
    49. else
    50. {
    51. if (j==n)
    52. j -= n;
    53. else if (i<0)
    54. i += n;
    55. }
    56. }
    57. }
    58. void DoublyEvenMagicSquare(vector<vector<int> > &matrix, int n)
    59. {
    60. vector<vector<int> > I(n, vector<int> (n, 0));
    61. vector<vector<int> > J(n, vector<int> (n, 0));
    62. int i, j;
    63. //prepare I, J
    64. int index=1;
    65. for (i=0; i<n; i++)
    66. for (j=0; j<n; j++)
    67. {
    68. I[i][j]=((i+1)%4)/2;
    69. J[j][i]=((i+1)%4)/2;
    70. matrix[i][j]=index;
    71. index++;
    72. }
    73. for (i=0; i<n; i++)
    74. for (j=0; j<n; j++)
    75. {
    76. if (I[i][j]==J[i][j])
    77. matrix[i][j]=n*n+1-matrix[i][j];
    78. }
    79. }
    80. void SinglyEvenMagicSquare(vector<vector<int> > &matrix, int n)
    81. {
    82. int p=n/2;
    83. vector<vector<int> > M(p, vector<int> (p, 0));
    84. MagicSquare(M, p);
    85. int i, j, k;
    86. for (i=0; i<p; i++)
    87. for (j=0; j<p; j++)
    88. {
    89. matrix[i][j]=M[i][j];
    90. matrix[i+p][j]=M[i][j]+3*p*p;
    91. matrix[i][j+p]=M[i][j]+2*p*p;
    92. matrix[i+p][j+p]=M[i][j]+p*p;
    93. }
    94. if (n==2)
    95. return;
    96. vector<int> I(p, 0);
    97. vector<int> J;
    98. for (i=0; i<p; i++)
    99. I[i]=i+1;
    100. k=(n-2)/4;
    101. for (i=1; i<=k; i++)
    102. J.push_back(i);
    103. for (i=n-k+2; i<=n; i++)
    104. J.push_back(i);
    105. int temp;
    106. for (i=1; i<=p; i++)
    107. for (j=1; j<=J.size(); j++)
    108. {
    109. temp=matrix[i-1][J[j-1]-1];
    110. matrix[i-1][J[j-1]-1]=matrix[i+p-1][J[j-1]-1];
    111. matrix[i+p-1][J[j-1]-1]=temp;
    112. }
    113. //j=1, i
    114. //i=k+1, k+1+p
    115. i=k;
    116. j=0;
    117. temp=matrix[i][j]; matrix[i][j]=matrix[i+p][j]; matrix[i+p][j]=temp;
    118. j=i;
    119. temp=matrix[i+p][j]; matrix[i+p][j]=matrix[i][j]; matrix[i][j]=temp;
    120. }
    121. void PrintMagicSquare(vector<vector<int> > &matrix, int n)
    122. {
    123. for (int i=0; i<n; i++)
    124. {
    125. for (int j=0; j<n; j++)
    126. printf(" %3d", matrix[i][j]);
    127. printf("\n");
    128. }
    129. printf("\n\n");
    130. }
    Alles anzeigen
  • was ist simply?

    Ich poste dir mal unsere Aufgabenbeschreibung und die Lösung einer Kommilitonin (code ist kürzer und außerdem besser dokumentiert)

    Das Erstellen eines magischen Quadrats zu einem gegebenen ungeraden n kann nach folgendem Verfahren erfolgen.
    * Das mittlere Feld wird mit der Zahl 1 belegt.
    * Die Zahl i + 1 wird links unterhalb von i eingetragen. Falls dieses Feld schon belegt ist, wird i + 1 zwei Felder unter i eingetragen.
    * Das Feld wird an den Rändern als zyklisch geschlossen angenommen.

    Schreiben Sie ein Programm magisch, das ein ungerades n > 0 als Kommandozeilen-
    parameter erwartet und das entsprechende magische Quadrat ausgibt. Verwenden
    Sie dynamischen Speicher zur Verwaltung des zwei-dimensionalen Felds.


    Quellcode

    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. void printArray(int* array, int n);
    4. int main(int argc, char *argv[]) {
    5. int n = atoi(argv[1]);
    6. int* quadrat = calloc(sizeof(int), n*n);
    7. int k, l, i = 1;
    8. /* belege mittleres Feld mit 1 */
    9. quadrat[(n/2) *n + (n/2)] = 1;
    10. /* belege restliches Feld */
    11. for (i=1 ; i<n*n ; i++) {
    12. for (k=0 ; k<n ; k++) {
    13. for (l=0 ; l<n ; l++) {
    14. /* i+1 wird links unterhalb von i eingetragen */
    15. if ((quadrat[k*n+l] == i) && (quadrat[((k+1+n)%n) *n + ((l-1+n)%n)] == 0)) {
    16. quadrat[((k+1+n)%n) *n + ((l-1+n)%n)] = i+1;
    17. }
    18. /* i+1 wird 2 Felder unter i eingetragen (falls Feld links unterhalb von i schon belegt) */
    19. else if ((quadrat[k*n+l] == i) && (quadrat[((k+1+n)%n) *n + ((l-1+n)%n)] != 0)) {
    20. quadrat[((k+2+n)%n) *n + l] = i+1;
    21. }
    22. }
    23. }
    24. }
    25. printArray(quadrat, n);
    26. free(quadrat);
    27. return 0;
    28. }
    29. /* Funktion zur Ausgabe eines zweidimensionalen Arrays */
    30. void printArray(int* array, int n) {
    31. int i, j;
    32. for (i=0 ; i<n ; i++) {
    33. for (j=0 ; j<n ; j++) {
    34. printf("%i\t",array[i*n+j]);
    35. }
    36. printf("\n\n");
    37. }
    38. }
    Alles anzeigen

  • ...einem gegebenen ungeraden n kann nach...


    So wie ich das aber verstanden habe, muss Super das für ein allgemeingültiges n <= 6 machen und nicht nur für ungrade n.
    Der Code von Super sieht ähnlich aus, wie die magic()-Function von MATLAB.
    Wenn man sich die anschaut, ist auch ersichtlich was doubly und singly bedeutet:
    es geht dabei um die Ordnung des Quadrates:
    Sollte n ungrade sein, dann wird die Funktion OddMagicSquare verwendet (klar).
    Sollte n grade sein, wird unterschieden, von welcher Ordnung das ganze ist:
    Es ist nämlich für den Algorithmus wichtig zu wissen, ob das n durch 4 oder nur durch 2 teilbar ist. Dementsprechend berechnet DoublyEvenMagicSquare das Magische Quadrat, wenn "n mod 4 = 0" ist, sprich n ohne Rest durch 4 teilbar ist.
    SinglyEvenMagicSquare wird dann verwendet, wenn n nur durch 2 teilbar ist, aber nicht durch 4.