[Ej. C] Cuadrado Mágico AYUDA

Shakurita

Pues eso, q tengo q hacer un cuadrado mágico de orden impar entre 3 y 11 (3,5,7,9 u 11 introducido por el usuario) y no tengo nidea de como implementarlo en C, a ver si me pudieseis ayudar, os dejo el enunciado por si alguien no sabe q es un cuadrado magico.

Escribe un programa en C que visualice un cuadrado mágico de orden impar n, comprendido
entre 3 y 11 (ej: 3, 5, 7...); el usuario introducirá por teclado el valor de n. Un cuadrado mágico
se compone de los números enteros comprendidos entre 1 y n². La suma de los números que figuran en
cada línea, cada columna y cada diagonal son idénticas. Por ejemplo, para n igual a 3, tendríamos
el siguiente cuadrado mágico:
8 1 6
3 5 7
4 9 2
Un método de construcción del cuadrado mágico consiste en situar el número 1 en el centro de la primera
línea, el número siguiente, el 2, en la casilla situada encima y a la derecha, y así sucesivamente.
Es preciso considerar que el cuadrado se cierra sobre sí mismo, es decir, la línea encima de la primera
es de hecho la última y la columna a la derecha de la última es la primera. Sin embargo, cuando la
posición del número caiga en una casilla ocupada, se elige la casilla situada debajo del número que
acaba de ser situado. (Prueba este método con el cuadrado anterior).

contruirlos, sé construirlos en un papel con un boli y siguiendo ese metodo de una casilla arriba y a la derecha, pero a la hora de hacer "automatizado" en C, pues no le encuentro la solucion, tened tb en cuenta que no puedo usar arrays porq se supone q aun no los hemos visto para ese ejercicio, vamos, este ejercicio está pensado para hacer uso solo de:
while
do-while
for
if,else if,else..
switch

solo puedo hacer uso de esas estructuras y con variables normales y corrientes. alguna idea? he dibujado los cuadrados a mano y he intentando encontrar alguna secuencia de algun tipo entre un numero y el siguiente dentro del cuadrado, pero por mas vueltas que le doy no encuentro ninguna solucion...

tampoco pido el codigo.. simplemente la idea, alguna secuencia a seguir,esta claro q debo encontrar un bucle de alguna manera... algo q me ayude a sacarlo, sabiendo eso podria intentar escribir yo el codigo... pero esq no se la solucion al problema.. no puedo implementar la solucion al problema.. :'(

gracias de antemano

dr_Rouman

No puedes usar matrices? joder...

Voy pensando algo, que no tengo ganas de estudiar :P

edit: a ver, primera duda xD.
Si el usuario tiene que introducir el número por teclado, y sólo puedes usar variables normales...cómo te las apañas? porque si no sabes usar memoria dinámica, no se me ocurre modo alguno para hacer esa parte.

Y sin matrices no se me ocurre nada para automatizarlo :/

gF

El esquema seria el siguiente:

for 1..n
..for 1..n
....calcular siguiente a imprimir

La función calcular siguiente a imprimir es la verdaderamente importante en el problema. El primero de cada línea sería siempre 1+((n+1)*nlinea-1) y a partir del primero habría que calcular los siguientes, si necesitas mas ayuda ve haciendo algo y yo si quieres te guio. Saludos

Shakurita

#2 como que como me las apaño? pues segun meta un 3, un 5, un 7, un 9 o un 11 debo hacer una cosa diferente (switch?..) el problema en como hacer esa cosa..

#3 gracias, pero no entiendo del todo "1+((n+1)nlinea-1)"
n supongo sera el dado por el usuario, el orden del cuadrado.. y nlinea supongo q sera la linea (1ª, 2ª, 3ª..) no? si es asi no me cuadra, dices q eso para el primero de cada linea, por lo q el primero de la 1ª linea de orden 3 seria : 1+((3+1)
1-1)=1+(4*0)=1+0=1 : s

edit: leyendo tu post me he dado cuenta q con n te refieres al n que has puesto en el for no ? el q se va incrementando. de todas formas nlinea no puede ser el numero de linea ia que entonces para la primera linea siempre saldria 1-1=0 y siempre daria 1+0, lo cual es erroneo, aclare esa formula plz (y si no es mucho pedir como has llegado a esa conclusion tb xd, porq por mas vueltas q le doy no encuentro correlacion entre los numeros).

PD: se me olvido decir tb q se supone q aun tampoco podemos usar funciones XDDD pero bueno, supongo q sabiendo lo q debe hacer esa funcion, lo puedo "traducir" a sin funcion

gF

Pq para seguir un orden, supongo k el primer elemento de la primera linea es el 1 y a partir de ese se calcula el resto de la misma linea.
Además, si empiezas el cuadrado con el 1, el resto de lineas comenzaran con el nº siguiendo la formula ke te he dado, compruebalo:

1 6 8
5 7 3
9 2 4

01 08 15 17 24
07 14 16 23 05
13 20 22 04 06
19 21 03 10 12
25 02 09 11 18

LOc0

1 6 8
5 7 3
9 2 4

01 08 15 17 24
07 14 16 23 05
13 20 22 04 06
19 21 03 10 12
25 02 09 11 18

Esos no son cuadrados mágicos :(

Si tengo un rato lo miro.

Salu2 ;)

PD: Si no puedes usar arrays, ni funciones ¿cómo piensas imprimir el cuadrado en pantalla? Tendrías que ir subiendo, bajando, etc... y para eso necesitas una función tipo gotoxy() (no ANSI por cierto).

Shakurita

pues ahi esta mi duda, como no puedo ir subiendo y bajando, deberia conocer los numeros de antemano para ir mostrandolos, pense q los numeros seguirian una correlacion, nose, por ejemplo, que cada uno fuese el doble del anterior (por poner una secuencia simple), si tal secuencia existiera seria facil porq podria poner

printf("\n %d %d %d",algo,algo=2*algo, y asi sucesivamente....

PD: #5, lo que dice #6, eso no son cuadrados magicos ya que sus diagonales no suman lo mismo, lo he mirado por encima, y las horizontales y verticales creo q si, pero para q sea cuadrado magico, tb lo deben sumar sus diagonales, aunq gracias

edit: ahroa q lo pienso, tu has supuesto q el primer elemento es el 1 verdad? y te ha salido el resto del cuadrado aplicando esa formula? entonces ya tengo la solucion, solo tengo q suponer q el primero elemento es el 8 (en el caso de orden 3) y debe salir no ?

sigo sin encontrar relacion alguna entre:
1+((n+1)*nlinea-1)
y
1 6 8
5 7 3
9 2 4

01 08 15 17 24
07 14 16 23 05
13 20 22 04 06
19 21 03 10 12
25 02 09 11 18

vamos, no sé aplicar la formula para que te salga eso ¿A QUE LE LLAMAS N Y A QUE LE LLAMAS NLINEA, O ES N*LINEA?

gF

Vale no son cuadrados mágicos tal como están escritos pq yo he puesto el 1 en la primera posición y a partir de ahí se calcula el resto, pero si en el de n=3 la 3ª columna la pasas a la 1ª y en el de n=5 la 4ª y 5ª las pasas a 1ª y 2ª ya si lo son.
Entonces más o menos es lo mismo que tenía pensado, pero algo más complicado pq ya no tienes la referencia de un primer valor, pero weno te digo lo ke habría que adaptar, quedaría así:

for i=1..n
..for j=1..n
....cuadradomagico(i,j,n)

entonces ahora la función cuadradomagico() precalcularía los valores del cuadrado magico hasta encontrar el i,j que nos interesa el cual se devuelve y se imprime. Aunque no puedas usar funciones hazlo en principio en una funcion por claridad y luego lo cambias.

Pista: como sabes k el 1 se coloca en linea 1, posicion (n/2)+1, lo que tienes ke calcular en la funcion es uno a uno las coordenadas de los siguientes, es decir, en principio:

nlinea=1, nposicion=(n/2)+1, y se necesita una variable llamada ncolisiones inicializada a n que contara el nº de numero puestos que faltan hasta colisionar e incrementar en 1 el nº de lineas, osea ncolision=n.

Entonces vas calculando los siguientes valores, para el nº 2 se restaria 1 a nlinea, se sumaria 1 a nposicion y se restaría 1 a ncolision.

IMPORTANTISIMO: recuerda que cuando nlinea=0 tienes que actualizar a nlinea=n, cuando nposicion sea > n se actualiza a nposicion=1 y cuando ncolision=0, ncolision=n y nlinea=nlinea+1

Todo este proceso se hace hasta que un nº se coloque en la posicion (nlinea,nposicion) = (i,j) que pasamos como parámetros.

Creo que todo queda bien explicado, el código no lo voy a escribir como dije, pero si tienes dudas escribelo y te las resuelvo.

PD: No hacen falta gotoxy ni capullos, solo imaginación.

Shakurita

omg thx

LOc0

#9 Cuando lo tengas, si funciona, pon el código por curiosidad. ME piro a estudiar...

Salu2 ;)

Edito: http://pastebin.com/863709

Shakurita

hoy esq ni me he parado a pensarlo, mañana me pondre, aunq segun he leido asi por encima creo q no voy a ser capaz XDD ;$ de todas formas si consigo algo lo pasteo

edit: interesante tu edit, decir q tb se me ocurrio algo parecido... peeeeeeero, para el caso de orden nueve tendria q crear 81 variables... y en el de 11? 121... XD, asi q rechacé esa idea, PERO MUCHAS GRACIAS A TODOS :D

LOc0

Juas, no me había dado cuenta de que no hace falta almacenar el cuadrado ya que no se va a hacer ninguna operación con sus elementos.

Así que el algoritmo propuesto por gF es genérico :) :
http://pastebin.com/863725

Salu2 ;)

Shakurita

repito, muchisimas gracias XD :P

PD: si has definido la constante TAM_CUADRADO con la idea de cambiar ahi el tamaño del cuadrado por 7 por ejemplo, no funciona, vamos, q no te muestra un cuadrado de orden de 7.

thhhhhhhhhhhx!

LOc0

Es que se me había olvidado sustituir en un sitio TAM_CUADRADO.

Ya ta, ahora sí va perfesto -> http://pastebin.es/414

Salu2 ;)

Shakurita

LOc0 fan. thx :D

edit: perdona XD, pero con el 2º codigo q has puesto me pasa esto:
http://www.slibe.com/image/76bd3e17-Sliber/

LOc0

NO, a ver. Para usarlo tienes que poner por ejemplo:

http://img114.imageshack.us/img114/6740/cmagico2pn.jpg

Salu2 ;)

PD: El mérito real es de gF...

Shakurita

edit: vale nada xd ok thx, tengo q ejecutarlo desde el cmd xd, thx

19 días después
cracking

aqui subo una solucion haciendo uso de arrays por si a alguien le interesa, solo hace uso de algo asi mas "especial" los arrays, importante leer el metodo del enunciado para entenderlo

http://www.yousendit.com/transfer.php?action=download&ufid=6806ACE83693D6FD

Usuarios habituales

  • cracking
  • Shakurita
  • LOc0
  • gF
  • dr_Rouman