[ Foro de Pascal ]

Problema programa cuadrado magico pascal

24-May-2014 01:20
Invitado (Estudiante desesperado)
3 Respuestas

Tengo que hacer un problema de un cuadrado mágico. Ya tengo las matrices y ahora lo que necesito es que desde 1 hasta el orden de la matriz al cuadrado esten todos los numeros sin repetirse. Por ejemplo en una 2x2 estarían el 1,2,3,4 da igual el orden pero no se pueden repetir. Si esta bien te tiene que devolver TRUE. Por ejemplo n=2 (2,4;1,3) -> TRUE; n=2(3,2;34) ->FALSE.
De momento tengo esto pero funciona para algunas y para otras no. Si alguien me puede ayudar . Aparte de eso estan los procediminetos de la matriz pero esos si funconan


tpCuadMagic = array [tpDim,tpDim] of integer;

 var CM:tpCuadMagic;
     
   n:tpDIm;
 function estanTodos(CM:tpCuadMagic; n:tpDim):boolean;
  var i,j,p:integer;
  begin
     for i:=1 to n do
      for j:=1 to n do
     begin
       for p:=1 to n*n do
        begin
        if (p=CM[i,n]) or (p=CM[n,j]) then
         p:=p+1;
         end;
        if p=n*n then
         estanTodos:=true
         else
         estanTodos:=false;
           if (estanTodos=true) then
            writeln ('True');
           if (estanTodos=false) then
            writeln('False');
          readln;
      end;
      readln;

  end;



24-May-2014 11:01
Nacho Cabanes (+83)

Hay varios tipos de "cuadrados mágicos"...

http://es.wikipedia.org/wiki/Cuadrado_m%C3%A1gico

así que, por favor, detalla un poco más lo que tienes que comprobar de tu matriz.

Anticipando tu respuesta, me parece entender que quieres una función auxiliar que mire si en una matriz de 2x2 aparecen todos los números del 1 al 4. Si es así, yo me crearía una matriz unidimensional de tamaño 4 (en general sería 1...n*n) en la que iría anotando el contador de veces que aparece cada valor. Tras terminar de recorrer la matriz bidimensional, compruebas si en todas las posiciones de la matriz unidimensional aparece 1. Si en alguna posición aparece 0 o un número mayor que 1, es que algún dato no existía o estaba repetido.


24-May-2014 12:25
Invitado (Estudiante desesperado)

Es un cuadrado mágico de dimension hasta 10x10 donde la suma de cada columna, fila y las diagonales sumen el mismo numero.
Había pensado en algo parecido pero no se plasmarlo en pascal. No se como hacer ese tipo de contador. Aparte de esa funcion tengo dos procedimentos uno que me crea la matriz y otro la muestra.


25-May-2014 11:58
Nacho Cabanes (+83)

Para 2x2 (por simplificar), ese contador podría ser algo así:


var
    matrizLineal: array[1..4] of integer;
    pos, fila, columna: integer;
    diferentesDeUno: integer;
begin
    diferentesDeUno := 0;
    { Vaciamos la matriz lineal, no necesario en algunos compiladores }
    for pos := 1 to 4 do
        matrizLineal[pos] := 0;
    { Recorremos la bidimensional, contando }
    for fila := 1 to 2 do
        for columna := 1 to 2 do
            begin
            pos := (fila-1)*2 + columna;
            inc(matrizLineal[pos]);
            end;
    { Finalmente, comprobamos si la matriz lineal sólo contiene unos }
    for pos := 1 to 4 do
        if matrizLineal[pos] <> 1 then 
            inc ( diferentesDeUno );
{Falta devolver un booleano o lo que decidas... }


Este código está sin probar, pero confío en que te dé una idea muy cercana de lo que me refiero.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)