global grid[] blen w h cnt .
dir[][] = [ [ 0 -1 ] [ -1 0 ] [ 0 1 ] [ 1 0 ] ]
# 
proc walk y x . .
   if y = 0 or y = h or x = 0 or x = w
      cnt += 2
      return
   .
   t = y * (w + 1) + x
   grid[t] += 1
   grid[blen - t] += 1
   for i to 4
      dx = dir[i][1]
      dy = dir[i][2]
      d = dx + dy * (w + 1)
      if grid[t + d] = 0
         walk y + dy x + dx
      .
   .
   grid[t] -= 1
   grid[blen - t] -= 1
.
proc solve hh ww recur . .
   w = ww
   h = hh
   if h mod 2 = 1
      swap h w
   .
   if h mod 2 = 1
      cnt = 0
      return
   .
   if w = 1
      cnt = 1
      return
   .
   if w = 2
      cnt = h
      return
   .
   if h = 2
      cnt = w
      return
   .
   cy = h div 2 ; cx = w div 2
   blen = (h + 1) * (w + 1)
   grid[] = [ ]
   len grid[] blen
   blen -= 1
   if recur = 1
      cnt = 0
   .
   for x = cx + 1 to w - 1
      t = cy * (w + 1) + x
      grid[t] = 1
      grid[blen - t] = 1
      walk cy - 1 x
   .
   cnt += 1
   if h = w
      cnt *= 2
   elif w mod 2 = 0 and recur = 1
      solve w h 0
   .
.
proc main . .
   for y = 1 to 8
      for x = 1 to y
         if x mod 2 = 0 or y mod 2 = 0
            solve y x 1
            print y & " x " & x & ": " & cnt
         .
      .
   .
.
main
