I am working on the odd number magic square problems.
I start the first number in the last row and center column. It worked on the 3x3 square, but not on any other odd numbers. Can anybody check my code?

def magic(n):
	if n > 2 and n % 2 == 0:
		print "You need an odd number."
	elif n <=2:
		print "You need a number greater or equal to 3."
	else:
		print "Magic Square: ", n, 'x', n
		grid = [ [ 0 for c in xrange(n) ] for r in xrange(n) ]
		row, col = 0, n/2
		n2, v = n*n, 1;
		r, c = 0, 0
		grid[row][col] = v
		while v != n2:
			v += 1
			if (row-1) >= 0:
			    r = row-1
			else:
			    r = n-1
			if (col+1) < n:
			    c = col+1
			else: c = 0
			if grid[r][c]:
				if (row+1) < n:
					r = row+1
					if grid[r][col]:
					    break
					c = col
			grid[r][c] = v
			row = r
			col = c
		for r in xrange(n):
			for c in xrange(n):
				print "%2d" % grid[r][c],
			print

Recommended Answers

All 3 Replies

Actually, it seems fine. I have no problems with magic(5) and magic(7). Only trouble I had was your %2d format was too narrow for magic(15), but a quick fix to that worked as well.

Why do you think it's not working?

Sorry the code I posted is before I made change. I wrote a new code so that the starting number is on the last row and center column. when I made this change, the sum doesn't add up same.

def magic(n):
	if n > 2 and n % 2 == 0:
		print "You need an odd number."
	elif n <=2:
		print "You need a number greater or equal to 3."
	else:
		print "Magic Square: ", n, 'x', n
		grid = [ [ 0 for c in xrange(n) ] for r in xrange(n) ]
		row = n-1
		col = (n-1)/2
		M = n*n #largest number on the grid
		v = 1
		r = 0
		c = 0
		grid[row][col] = v
		while v != M:
			v =v + 1
			if (row+1) >= n:
			    r = 0
			else:
			    r = row + 1
			if (col+1) < n:
			    c = col+1
			else: c = 0
			if grid[r][c]:
				if (row+1) < n:
					r = row+1
					c = col
			grid[r][c] = v
			row = r
			col = c
		for r in xrange(n):
			for c in xrange(n):
				print grid[r][c],
			print

Hmmm ... if you go down and to the right, shouldn't you head UP when you've hit a nonempty square? Your code seems to go down, which ruins the symmetry.

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.