C#を使用して目的地に到達するために騎士が必要とする最小ステップ数を見つける方法は?
騎士にボードのすべてのセルをカバーさせる必要があり、セルに移動できるのは1回だけです。
騎士の移動を終了するには、2つの方法があります。1つは、騎士が開始した場所からセルから1人の騎士が移動することで、開始した位置に移動してループを形成できることです。これはクローズドと呼ばれます。騎士が他の場所で終了する2番目のツアー、これはオープンツアーと呼ばれます。チェス盤の内側にあり、セルがまだ占有されていない場合、移動は有効です。占有されていないすべてのセルの値を-1に等しくします。
例
using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;
namespace ConsoleApplication{
public class KnightWalkProblem{
public class cell{
public int x, y;
public int dis;
public cell(int x, int y, int dis){
this.x = x;
this.y = y;
this.dis = dis;
}
}
static bool isInside(int x, int y, int N){
if (x >= 1 && x <= N && y >= 1 && y <= N)
return true;
return false;
}
public int minStepToReachTarget(int[] knightPos, int[] targetPos, int N){
int[] dx = { -2, -1, 1, 2, -2, -1, 1, 2 };
int[] dy = { -1, -2, -2, -1, 1, 2, 2, 1 };
Queue<cell> q = new Queue<cell>();
q.Enqueue(new cell(knightPos[0], knightPos[1], 0));
cell t;
int x, y;
bool[,] visit = new bool[N + 1, N + 1];
for (int i = 1; i <= N; i++)
for (int j = 1; j <= N; j++)
visit[i, j] = false;
visit[knightPos[0], knightPos[1]] = true;
while (q.Count != 0){
t = q.Peek();
q.Dequeue();
if (t.x == targetPos[0] && t.y == targetPos[1])
return t.dis;
for (int i = 0; i < 8; i++){
x = t.x + dx[i];
y = t.y + dy[i];
if (isInside(x, y, N) && !visit[x, y]){
visit[x, y] = true;
q.Enqueue(new cell(x, y, t.dis + 1));
}
}
}
return int.MaxValue;
}
}
class Program{
static void Main(string[] args){
KnightWalkProblem kn = new KnightWalkProblem();
int N = 30;
int[] knightPos = { 1, 1 };
int[] targetPos = { 30, 30 };
Console.WriteLine(
kn.minStepToReachTarget(
knightPos,
targetPos, N));
}
}
}
出力
20
-
Pythonで赤ちゃんと巨大なステップによって目的地に到達するために必要な最適なステップの数を見つけるためのプログラム
クエリQのリストがあり、各クエリQ [i]にトリプレット[a_i、b_i、d_i]が含まれているとします。最初は位置(0、0)にいると考えてください。その後、1つのステップで、ある位置(x1、y1)から(x2、y2)に移動できます。ここで、これら2点間のユークリッド距離は少なくともa、最大でbです。ここで、クエリごとに、(0、0)から(d_i、0)に到達するために必要な最小ステップ数を見つける必要があります。 したがって、入力がQ =[(2,3,1)、(1,2,0)、(3,4,11)]のようである場合、出力は[2、0、3]になります。 a =2の(0、0)からの最初のクエリは、$ \ lef
-
Pythonを使用して数値の階乗を見つける方法は?
数値の階乗は、1とそれ自体の間のすべての整数の積です。与えられた数の階乗を見つけるために、1からそれ自体までの範囲でforループを形成しましょう。 range()関数は停止値を除外することに注意してください。したがって、停止値は入力数より1大きい値にする必要があります。 範囲内の各数値は、1に初期化される変数fで累積的に乗算されます 例 num=int(input('enter a number')) f=1 for i in range(1,num+1): f=f*i print ('factorial of', num, '='