皇室の夜


問題の定義
幸福王国の王室庭園はチェス盤のような8×8座標平面です.ナイトは王室の庭の特定の部屋に立っている.ナイトはとても忠実な臣下で、毎日武術を練習しています.
ナイトは乗馬なので移動時はL字形でしか移動できず、庭に出られません.特定の場所から次の2つの状況に移動できます.
  • は2つの格子を水平に移動し、その後、1つの格子
  • を垂直に移動する.
  • 垂直に2つのグリッドを移動し、次に水平に1つのグリッド
  • を移動する
    このような8 X 8座標平面上にあるノードの位置を指定すると、そのノードが移動可能な数を出力するプログラムを作成することができる.このとき,王室の庭における行為を表現する位置は1から8であり,表現列の位置はaからhである.
    たとえば、あるノードがa 1上で移動可能である場合、次の2つのケースがあります.a 1の位置は座標平面上の隅に相当する位置にあるため、庭の外から出られないことが多い.
    右側に2つのグリッドを移動し、次に1つのグリッド(c 2)を下に移動します.
  • は2つのグリッドを下に移動し、右に1つのグリッド(b 3)
  • を移動する.
    もう1つの例は、ナイトがc 2に位置する場合、ナイトが移動できる場合が6つある.これは自分で計算しなさい.

    入出力条件
    最初の行には、現在のナイトが位置する座標(8×8座標平面)を表す2つの文字からなる文字列が入力されます.入力文字はa 1のように列と行からなる.
    最初の行にナイトが移動可能な場合は、個数を出力します.
    I/O例
    入力:a 1、出力:2
    私が作ったコード
    curpos = input()
    curpos = 'a1'
    dict = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5, 'f':6, 'g':7, 'h':8}
    curx = int(dict[curpos[0]])
    cury = int(curpos[1])
    cnt = 0
    # 8가지 경우의수
    if (curx - 2) >= 0: # left
        if (cury-1) >= 1:
            cnt += 1 # up
        if (cury+1) <= 8:
        	cnt += 1 # down
    if (curx + 2) <= 8: # right
        if (cury-1) >= 1:
            cnt += 1 # up
        if (cury+1) <= 8:
        	cnt += 1 # down
    if (cury - 2) >= 1: # up
        if (curx-1) >= 1:
            cnt += 1 # left
        if (curx+1) <= 8:
        	cnt += 1 # right
    if (cury + 2) <= 8: # down
        if (curx-1) >= 1:
            cnt += 1 # left
        if (curx+1) <= 8:
        	cnt += 1 # right
    print(cnt)
    コードの改良
  • 文字列を受け取ったとき、ord()でASKIIコードに変換し、数値に変換する方法!
  • # 현재 나이트 위치 입력
    input_data = input()
    curx = int(ord(input_data[0])) - int(ord('a')) + 1 *
    cury = int(input_data[1])
    
    # 나이트가 이동할 수 있는 8가지 방향 정의
    steps = [(-2,-1), (-1,-2), (1,-2), (2,-1), (2,1), (1,2), (-1,2), (-2,1)]
    
    cnt = 0
    for step in steps:
    	nx = curx + step[0]
        ny = cury + step[1]
        
        if nx >= 1 and nx < 8 and ny > 1 and ny <= 8:
        	cnt += 1
    print(cnt)