[ 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)]
!!!Reference
この問題について([ baekjoon ] 1913. カタツムリ.), 我々は、より多くの情報をここで見つけました https://velog.io/@ayoung0073/algorithm-baekjoon-1913テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol