2010-12-07 22 views
5

Para aquellos que no están familiarizados con el clásico algoritmo cuadrado mágico: Un cuadrado mágico es un conjunto bidimensional (n x n) que contiene un valor numérico entre los valores 1 y n^2 en cada ubicación. Cada valor puede aparecer solo una vez. Además, la suma de cada fila, columna y diagonal debe ser la misma. La entrada debe ser impar ya que estoy escribiendo una solución cuadrada mágica impar.Magic Square Program (C++)


He completado el problema, pero a partir de ahora tiene un error desconocido (lógica? Salida?) Que me ha estado irritante durante la última hora. Los valores que salen son muy fuera de marca. Cualquier ayuda sería muy apreciada:


#include<iostream> 
#include<iomanip> 
using namespace std; 

int main() 
{ 
    int n; 

    cout<< "Please enter an odd integer: "; 
    cin>>n; 

    int MagicSquare[n][n]; 


    int newRow, 
    newCol; 

    // Set the indices for the middle of the bottom i 
    int i =0 ; 
    int j= n/2; 

    // Fill each element of the array using the magic array 
    for (int value = 1; value <= n*n; value++) 
    { 
    MagicSquare[i][j] = value; 
    // Find the next cell, wrapping around if necessary. 
    newRow = (i + 1) % n; 
    newCol = (j + 1) % n; 
    // If the cell is empty, remember those indices for the 
    // next assignment. 
    if (MagicSquare[newRow][newCol] == 0) 
    { 
     i = newRow; 
     j = newCol; 
    } 
    else 
    { 
     // The cell was full. Use the cell above the previous one. 
     i = (i - 1 + n) % n; 
    } 

    } 


    for(int x=0; x<n; x++) 
    { 
    for(int y=0; y<n; y++) 
     cout << MagicSquare[x][y]<<" "; 
    cout << endl; 
    } 
} 
+3

Y el error es _what_, exactamente? ¿Qué está haciendo y cuál es la diferencia entre eso y lo que ** debería ** estar haciendo? ¿Has probado usar un depurador? –

+0

¿Ha intentado depurarlo en un depurador? GDB y VS C++ Express son gratuitos. No hay muchas excusas para no hacerlo. – linuxuser27

+0

inicializa la matriz con el valor inicial, es decir, 0. o utiliza un idioma que inicializa la matriz al valor predeterminado. Al igual que java initialize int to 0, flotar a 0.0 y object array a null. – Trying

Respuesta

12

te olvidó inicializar su MagicSquare para contener todos los ceros:

for(int i = 0; i < n; i++) { 
    for(int j = 0; j < n; j++) { 
     MagicSquare[i][j] = 0; 
    } 
    } 

Por lo tanto esta comprobación casi siempre fallará:

if (MagicSquare[newRow][newCol] == 0) { 
    i = newRow; 
    j = newCol; 
} 

Como C/++ no los inicializa en 0 para usted.

0

usted no puede tomar el número n por parte del usuario, ya que hay que definir el tamaño de la matriz con una constante

+0

Eso no es cierto. Puede definir una matriz de tamaño arbitrario poniéndolo en un ámbito separado {...}. Por supuesto, mira tu stack en este caso. – Archie

+0

@Archie ¿Podría explicar por qué esta es la sintaxis legal? No seguí, pero todos los demás parecen estar en la misma página con usted. – Panzercrisis

+0

@Archie: Eso no es correcto. C++ no permite matrices de longitud variable, independientemente del alcance en el que se encuentren. Algunos compiladores pueden permitirlo como una extensión, pero no es estándar. – zindorsky

-1

Debe crear la matriz dinámica con el fin de escuchar dimensión del teclado, pero no se olvide de borrar arrays cuando no es necesario que

+0

La pregunta no era sobre matrices dinámicas. Las respuestas existentes son correctas. – yakatz

0

se debe inicializar contener todos los elementos de ceros:

memset(MagicSquare, 0, sizeof(MagicSquare)); 

othewise que muestran el valor de la basura.
N.B: la función memset se incluye en el archivo de encabezado cstring.

Su corregido code:

#include<iostream> 
#include<iomanip> 
#include <cstring> 
using namespace std; 

int main() 
{ 
    int n; 

// cout<< "Please enter an odd integer: "; 
    cin>>n; 

    int MagicSquare[n][n]; 


    int newRow, 
    newCol; 
    memset(MagicSquare, 0, sizeof(MagicSquare)); 
    // Set the indices for the middle of the bottom i 
    int i =0 ; 
    int j= n/2; 

    // Fill each element of the array using the magic array 
    for (int value = 1; value <= n*n; value++) 
    { 
    MagicSquare[i][j] = value; 
    // Find the next cell, wrapping around if necessary. 
    newRow = (i + 1) % n; 
    newCol = (j + 1) % n; 
    // If the cell is empty, remember those indices for the 
    // next assignment. 
    if (MagicSquare[newRow][newCol] == 0) 
    { 
     i = newRow; 
     j = newCol; 
    } 
    else 
    { 
     // The cell was full. Use the cell above the previous one. 
     i = (i - 1 + n) % n; 
    } 

    } 


    for(int x=0; x<n; x++) 
    { 
    for(int y=0; y<n; y++) 
     cout << MagicSquare[x][y]<<" "; 
    cout << endl; 
    } 
} 
0
#include<iostream.h> 
#include<iomanip.h> 
int main() 
{ 
    int arr[25][25]={0}; 
    cout<<"Enter size(odd):"; 
    int size; 
    cin>>size; 
    int i=0,j=(size-1)/2,n=1; 
    arr[i][j]=n; 
    while(n<=size*size){ 
      i--; 
      j--; 
      if(i<0&&j>=0){ 
       i=size-1; 
       arr[i][j]=n; 
       n++; 
      }else if(j<0&&i>=0){ 
       j=size-1; 
       arr[i][j]=n; 
       n++; 
      }else if(i<0&&j<0){ 
       i=i+2; 
       j=j+1; 
       arr[i][j]=n; 
       n++; 
      }else if(arr[i][j]!=0){ 
       i=i+2; 
       j=j+1; 
       arr[i][j]=n; 
       n++; 
      }else{ 
       arr[i][j]=n; 
       n++; 
      } 
     } 
     for(i=0,i<ize;i++){ 
      for(j=0,j<size;j++){ 
        cout<<setw(3)<<arr[i][j]; 
      } 
      cout<<endl; 
     } 
     return 0; 
    } 
+0

No se recomiendan las respuestas de solo código. Por favor, agregue explicaciones sobre _why_ y _how_ you code funciona. – lolbas