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つのパスを歩き終わります.パスで座標平面からずれることを排除します. 現在の座標を設定...どうしよう… [マイコード]
要求通りに忠実に実施すればよい.キャバクラの8つのパスを1人ずつチェックし、各位置に移動できるかどうかを確認します.リストを使用して、8方向の方向ベクトルを定義します.
[正しい]
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:という形式で書かれた場合,結果は正しくない.
[質問]
王室庭園とチェス盤は8×8座標平面です.ナイトは王室の庭の特定の部屋に立っている.ナイトは乗馬中なので、移動時はL字形でしか移動できず、庭の外から出られません.nightは、次の2つの状況に移動できます.
このように、8 x 8座標平面上に夜の上に位置する位置が見つかった場合、夜に移動できる数を出力するプログラムを作成する.行位置1~8列の位置はa~h
入力条件:最初の行には、現在のナイトが位置する座標(8 x 8座標平面)を表す2つの文字からなる文字列が入力されます.
出力条件:最初の行にナイトが移動可能な場合は、数値を出力します.
[私の考え]
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)
replitReference
この問題について(2-2-3 chess knight), 我々は、より多くの情報をここで見つけました https://velog.io/@kangmin01/2-2-3テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol