2-2-3 chess knight


講義
[質問]
王室庭園とチェス盤は8×8座標平面です.ナイトは王室の庭の特定の部屋に立っている.ナイトは乗馬中なので、移動時はL字形でしか移動できず、庭の外から出られません.nightは、次の2つの状況に移動できます.
  • 水平に2つの格子を移動した後、垂直に1つの格子
  • を移動する.
  • 垂直に2つの格子を移動した後、水平に1つの格子
  • を移動する.
    このように、8 x 8座標平面上に夜の上に位置する位置が見つかった場合、夜に移動できる数を出力するプログラムを作成する.行位置1~8列の位置はa~h
  • c 2で移動できるのは6種類.
  • これは典型的なシミュレーションであり,2次元座標を用いた実装問題を同時に完全にナビゲーションするタイプである.
    入力条件:最初の行には、現在のナイトが位置する座標(8 x 8座標平面)を表す2つの文字からなる文字列が入力されます.
    出力条件:最初の行にナイトが移動可能な場合は、数値を出力します.
    [私の考え]
  • ナイトクラブの移動経路を関数としています.
  • には最大8つのパスがあるので、8つのパスを歩き終わります.パスで座標平面からずれることを排除します.
  • 現在の座標を設定...どうしよう…
  • [マイコード]
    a = list(input())
    x,y = a[1],a[0]
    abc = ['a','b','c','d','e','f','g','h']
    
    ax = 0
    for xstr in abc:
      ax += 1
      if x == abc[xstr]:
        return x = ax
    
    dx = [0,0,-1,1]
    dy = [-1,1,0,0]
    count = 0
    
    for row in range(2,4):
      nx = x + dx[row] + dx[row]
      ny = y + dy[row] + dy[row]
      for column in range(2):
        nx = nx + dx[column]
        ny = ny + dy[column]
        if nx >= 1 or nx <= 8 or ny >= 1 or ny >= 8:
          count += 1
        
    for column in range(2):
      nx = x + dx[column] + dx[column]
      ny = y + dy[column] + dy[column]
      for row in range(2,4):
        nx = nx + dx[row]
        ny = ny + dy[row]
        if nx >= 1 or nx <= 8 or ny >= 1 or ny >= 8:
          count += 1
    
    print(count)
    [問題解決の考え方]
    要求通りに忠実に実施すればよい.キャバクラの8つのパスを1人ずつチェックし、各位置に移動できるかどうかを確認します.リストを使用して、8方向の方向ベクトルを定義します.
    [正しい]
    input_data = input()
    row = int(input_data[1])
    column = int(ord(input_data[0])) - int(ord('a')) + 1
    
    steps = [(-2,-1),(-2,1),(2,-1),(2,1),(-1,-2),(1,-2),(-1,2),(1,2)]
    
    count = 0
    for step in steps:
      next_row = row + step[0]
      next_column = column + step[1]
      if next_row >= 1 and next_row <= 8 and next_column >= 1 and next_column <= 8:
        count += 1
    
    print(count)
    [フィードバック]

  • 8つのルートが良いことを逐一確認したいのですが、ここまでが良いです.

  • 文字列文字列は元は配列でありlistに置き換える必要はありません.

  • 現在の位置を指定する場合、[0][0]、すなわち、第1行の第1列をどのように設定するか分からない場合は、空間に存在しないようにコードを記述するだけでよい.(if構文を参照)

  • 必ず熱を表す文字a~hを1~8に変えたいと思います.置換を必要とせずにアスキーコードを利用してa~h文字を数字で表示し、aを基準に表示する方法があります…!考えが複雑すぎるようです.

  • for文で8つのパスを書きましたが、stepsで表現するよりずっと複雑です.ドアがもっと効率的になるという偏見が生まれたようです...8種類しかないなら、リストで表現して、どれも代入するのがもっと速くて簡単なようです.

  • 空間を離れるとif文を書いてcountを行い、orを使う.何でもない.こんな和弦が书かれていました.前回はこのように書かれたコードがあったので、ついて書いたようです.やめて

  • ord():特定の文字をAskyコード値に変換する関数

  • chr():Askyコード値を文字に変換する関数(10進数、16進数)

  • ASCII:英字の代表的な文字コードを使用します.簡単に言えば、コンピュータがデータをデジタルとして受け入れるため、各文字にはデジタルコードが付与される.

  • 文字コード(文字コード=テキストコード):ユーザーが入力した文字または記号をコンピュータで使用可能な信号に変換します.

  • 前回作ったコードを思い出してみました.やっていた仕事を思い出して良かったのですが、必ず「同じ」と書くのでバカ.目的によって問題を解決する方法も異なりますが、以前のコードを「完全に同じ」ように書こうとしないでください.参照してください!!!
    [+アクティブ化コード]
    真面目に書かれたfor文を救うために、それを分解して直しました.for column in range(2):この文からnx、nyの設定までは良いのですが、2番目の繰り返し文の場合nx=nx+dx[column]右側のnxは1番目の繰り返し文とは違って、結果がおかしい!!!したがって,最後の位置をlx,lyとして新しい変数として指定する.
    また,lx>=1とlx<=8 and ly>=1とly<=8:がこの部分で初めて>=8:という形式で書かれた場合,結果は正しくない.
    a = input()
    x = int(a[1])
    y = int(ord(a[0])) - int(ord('a')) + 1
    
    dx = [0,0,-1,1]
    dy = [-1,1,0,0]
    
    count = 0
    for row in range(2,4):
      nx = x + dx[row] + dx[row]
      ny = y + dy[row] + dy[row]
      for column in range(2):
        lx = nx + dx[column]
        ly = ny + dy[column]
        if lx >= 1 and lx <= 8 and ly >= 1 and ly <= 8:
          count += 1
      
    for column in range(2):
      nx = x + dx[column] + dx[column]
      ny = y + dy[column] + dy[column]
      for row in range(2,4):
        lx = nx + dx[row]
        ly = ny + dy[row]
        if lx >= 1 and lx <= 8 and ly >= 1 and ly <= 8:
          count += 1
    
    print(count)
    replit