[ baekjoon ] 1913. カタツムリ.


質問する


奇数自然数N(3≦N≦999)が与えられた場合、1〜N 2の自然数をN*Nの表にカタツムリの形で配列することができ、以下に示す.
9 2 3
8 1 4
7 6 5
25 10 11 12 13
24 9 2 3 14
23 8 1 4 15
22 7 6 5 16
21 20 19 18 17
Nが与えられた場合、これらのテーブルを出力するプログラムを作成します.また、N 2未満の自然数を指定する場合は、その座標を同時に出力してください.例えば、N=5の場合、6の座標は(4,3)である.

入力


第1行は奇数自然数Nを与える.2行目は、位置を探すN 2以下の自然数を与える.

しゅつりょく


N行にまたがって表を印刷します.行ごとにN個の自然数の1格の出力があれば、ビット数を合わせる必要はありません.N+1行では、入力された自然数座標を表す2つの整数を1マスずつ出力します.
n = int(input())
num = int(input())

# 1의 좌표
x = y = n // 2 
# 2차원 리스트 선언
array = [[0 for col in range(n)] for row in range(n)]
# 상하좌우
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]

def check_range(x, y): # 배열 범위 체크
  if x >= n or y >= n or x < 0 or y < 0:
    return False
  return True

idx = 0 # 상하좌우 인덱스
for i in range(1, n * n + 1):
  array[x][y] = i
  for _ in range(4):
    if idx == 4: 
      idx = 0
    if check_range(x + dx[idx], y + dy[idx]): # 배열 범위일 때
      if array[x + dx[idx]][y + dy[idx]] == 0: # 0이면 방문하지 않았을 때를 뜻함
        x += dx[idx]
        y += dy[idx]
        idx += 1 
        break
      else: # 이미 방문했다면 idx 를 반대로 
        idx -= 1
        continue
    else: # 배열 범위를 벗어나면
      idx += 1 # 다음 상하좌우 인덱스로
      continue
      
result_x = 0
result_y = 0
for i in range(n):
  for j in range(n):
    if array[i][j] == num: # 입력한 목표값이면 저장
      result_x = i
      result_y = j
    print(array[i][j], end = ' ')
  print()

print(result_x + 1, result_y + 1)
ワンパス
2 Dリスト宣言のみ検索
いくらやっても慣れないarray = [[0 for col in range(n)] for row in range(n)] !!!