🔙 Back to Top

Wed Jul 22 07:34:03 JST 2015

魔法陣ぐるぐる

Rubyの練習のつもりで、やるだけゲーをAOJで探して解いてた: 魔方陣 | Aizu Online Judge

奇数\(n\)が入力されるから、
大きさが\(n \times n\) の所謂、魔法陣を書けというもので、
魔法陣の書き方を問題文の中で説明してある.

(この問題の引用元であるPCKというのが何なのか知らないけれど、
説明が不正確だなぁ。。。

説明された魔法陣の作り方を完全に真似る必要があるのか、
あくまでヒントであって、自由に魔法陣を作ればいいのかが
判別できないし寧ろ後者に読めるが、
実際には前者らしかった)

#!/usr/bin/ruby
# coding: utf-8

PI = Math.acos(-1)

def padding(n)
  ("    " + n.to_s)[-4, 4]
end

def solve(n)
  f = Array.new(n)
  for i in 0...n
    f[i] = Array.new(n, 0)
  end

  x = 1 + n/2
  y = n/2
  for k in 1..(n*n)
    while f[x][y] > 0
      x += 1
      y += n-1
      x %= n
      y %= n
    end
    f[x][y] = k
    x += 1
    y += 1
    x %= n
    y %= n
  end

  for i in 0...n
    for j in 0...n
      print padding(f[i][n-j-1])
    end
    puts ''
  end
end

while true
  n = STDIN.gets.to_i
  if n == 0
    break
  else
    solve(n)
  end
end