Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
计算较少的跳数C#_C# - Fatal编程技术网

计算较少的跳数C#

计算较少的跳数C#,c#,C#,早上好:)我正在研究C#,我想写一个代码,可以计算从任意点到特定点的较少跳数,如图所示 我有从1到12的点,所以如果我想计算从点12到1的较少跳数,它将是逆时针方向的1,而不是顺时针方向的11跳。 另一个例子来澄清我的问题,如果我想计算从11点到4点的较少跳数,逆时针方向的跳数是5,而不是顺时针方向的跳数是6。注意:点数可能是奇数。 我希望你能理解我的问题。试着顺时针、逆时针,取最小值: 测试: // 5 Console.WriteLine(Hops(11, 4)); // 1 Console

早上好:)我正在研究C#,我想写一个代码,可以计算从任意点到特定点的较少跳数,如图所示

我有从1到12的点,所以如果我想计算从点12到1的较少跳数,它将是逆时针方向的1,而不是顺时针方向的11跳。 另一个例子来澄清我的问题,如果我想计算从11点到4点的较少跳数,逆时针方向的跳数是5,而不是顺时针方向的跳数是6。注意:点数可能是奇数。 我希望你能理解我的问题。

试着顺时针、逆时针,取最小值:

测试:

// 5
Console.WriteLine(Hops(11, 4));
// 1
Console.WriteLine(Hops(12, 1));
 // 12 -> 1 (clockwise) 1 hops
 Console.WriteLine(Solve(12, 1));
 // 11 -> 4 (clockwise) 5 hops
 Console.WriteLine(Solve(11, 4));
编辑:正如Matthew Watson在评论中提到的,您可能想知道它是顺时针还是逆时针:

测试:

// 5
Console.WriteLine(Hops(11, 4));
// 1
Console.WriteLine(Hops(12, 1));
 // 12 -> 1 (clockwise) 1 hops
 Console.WriteLine(Solve(12, 1));
 // 11 -> 4 (clockwise) 5 hops
 Console.WriteLine(Solve(11, 4));

你考虑过模运算符吗?这将得到第一个数的余数除以第二个数。例如:

6%3=0
(3正好变成6两次,所以剩余为零)

10%4=2
(4变成10两次,剩下的两次)

因此,您需要尝试两种路线,然后检查哪一条路线更小

因此,请尝试:

int numberOfPositions = 12;
Math.Min ((numberOfPositions + b - a) % numberOfPositions, (numberOfPositions + a -b) % numberOfPositions);
如果您想了解模计算是如何工作的,那么这里有一个在线计算器: 这么简单吗

int NUM_OF_NODES = 12;
int numOfHops = NUM_OF_NODES;
int point1 = 11;
int point2 = 4;
int path1 = Math.Abs(point1 - point2);
int path2 = numOfHops - path1;
int result =  path1 < path2 ? path1 : path2;
return result;
int NUM_OF_NODES=12;
int numohops=节点的数量;
int point1=11;
int点2=4;
int path1=Math.Abs(点1-2);
int-path2=numhops-path1;
int结果=路径1<路径2?路径1:路径2;
返回结果;
对于简单函数

public int getLeastPath(int point1, int point2)
{
    int path1 = Math.Abs(point1 - point2);
    int path2 = NUM_OF_NODES - path1;
    return path1 < path2 ? path1 : path2;
public int getLeastPath(int点1,int点2)
{
int path1=Math.Abs(点1-2);
int path2=节点数\u-路径1;
返回路径1

}

已经提供了最简单的答案,但这里有一个递归函数,它实际上是从一个数字“跳”到另一个数字:

        Func<int, int, int, int> Hop = null; 
        Hop = (direction, start, end) =>
            {
                if (start < 1)
                    start = 12;

                if (start != end)
                    return 1 + Hop(direction, (start + direction), end);

                return 0;
            };
Func-Hop=null;
跃点=(方向、开始、结束)=>
{
如果(开始<1)
开始=12;
如果(开始!=结束)
返回1+跳(方向,(开始+方向),结束);
返回0;
};
EX:11-8

1.获取第一个号码和最后一个号码的mod
11%12=1

8 % 12 = 8 
  • 将总和相加
    如果小于12>1+8=9 埃尔斯潜艇

  • 用12-9=3减去

  • 比较9和3,较小的值将是答案


  • 啊,我没看到你发布了基本相同的答案,发布时间非常相似,我会给你的答案加上一票,因为它更简洁。@Vistari:你的答案解释了发生了什么,所以+1用于教学。这里的问题是返回值并不表示它是顺时针还是逆时针。OP没有要求这样做,但我想知道他们是否应该这样做。@Matthew Watson:在这种情况下(如果需要方向),我建议实施
    顺时针跳数
    以及
    逆时针跳数
    方法,然后取min和argmin,见我的编辑。我想你可以像这样计算顺时针/逆时针跳数(逆时针为负值,如果有6个跃点,则首选顺时针):
    int顺时针=(结束-开始+12)%12;int逆时针=(开始-结束+12)%12;返回Math.Abs(顺时针)你需要知道答案是顺时针还是逆时针,或者只需要最少的步数就足够了吗?如果你需要知道答案是顺时针还是逆时针,在步数为6的情况下,你更喜欢顺时针6还是逆时针6?