Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.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++_Chess - Fatal编程技术网

C++ 国际象棋骑士到达棋盘上某一位置的最小步数

C++ 国际象棋骑士到达棋盘上某一位置的最小步数,c++,chess,C++,Chess,有一个无限的棋盘, 从控制台中,我们输入棋盘上将有多少个示例以及棋盘上有多少棋手,以及他们的起始位置(即他们所在的位置),以及骑士必须以最少的步数到达的点 下面是它的外观: 2-示例数量 1-国际象棋骑士的数量 5-起点 56-最后一点 2-国际象棋骑士的数量 0 0-第一位骑士的起点 10-第二个骑士的起点 01-第一位骑士的终点 11-第二位骑士的终点 答复: 3-第一个示例的答案 4-第二个示例的答案 问题是它不是这样的,因为对于第一个数据集,一切都很好,但是对于第二个数据集,它不

有一个无限的棋盘,
从控制台中,我们输入棋盘上将有多少个示例以及棋盘上有多少棋手,以及他们的起始位置(即他们所在的位置),以及骑士必须以最少的步数到达的点

下面是它的外观:

  • 2
    -示例数量
  • 1
    -国际象棋骑士的数量
  • 5
    -起点
  • 56
    -最后一点
  • 2
    -国际象棋骑士的数量
  • 0 0
    -第一位骑士的起点
  • 10
    -第二个骑士的起点
  • 01
    -第一位骑士的终点
  • 11
    -第二位骑士的终点
答复:

  • 3
    -第一个示例的答案
  • 4
    -第二个示例的答案
问题是它不是这样的,因为对于第一个数据集,一切都很好,但是对于第二个数据集,它不能得出正确的答案。
如果我们分别计算积分,则第二个数据集中的答案为6(第一个骑士为3,第二个骑士为3)。
我已经猜到了如何解决它,但它不起作用

推测是,当第二个骑士开始移动时,它通过了第一个骑士通过的相同点(第二个示例),您可能需要写下条件,如果第一个骑士已经在这些位置,那么第二个骑士无法再次通过它们

第二个猜想是,你需要写下棋盘的条件,使其无限,并使骑士走棋盘的负值

以下是一张示例照片(如下所示):

请帮忙,我将非常感激

#包括
#包括
#包括
#包括
使用名称空间std;
#定义n8
//下面的数组详细说明了所有8种可能的移动
//作为骑士
int行[]={2,2,-2,-2,1,1,-1,-1};
int col[]={-1,1,1,-1,2,-2,2};
//检查(x,y)是否为有效的棋盘坐标
//请注意,骑士不能走出棋盘
布尔值有效(整数x,整数y)
{
如果(x<0 | | y<0 | | x>=N | | y>=N)
返回false;
返回true;
}
//BFS中使用的队列节点
结构体类型
{
//(x,y)表示棋盘坐标
//dist表示它与源的最小距离
int x,y,dist;
//节点构造函数
节点(intx,inty,intdist=0):x(x),y(y),dist(dist){
//由于我们使用struct作为std::set中的键,
//我们需要让操作员超负荷工作
//或者,我们可以使用std::pair作为密钥
//在集合中存储矩阵的坐标

bool操作符根据您提供的数据,两名骑士应该这样移动:

(5,4)        <- first knight
  (3,3) = 1  <- distance to first final position
  (9,6) = 2  <- distance to second final position
(2,1)        <- second knight
  (3,3) = 1
  (9,6) = 4
  • 第一骑士:(0,0)->(0,1)
  • 第二骑士:(1,0)->(1,1)
然而,在你的图表中,你暗示骑士应该这样移动(忽略缺少
1
的错误x轴):

  • 第一骑士:(0,0)->(1,1)
  • 第二骑士:(0,1)->(1,0)

您的图表将每个骑士移动到另一个骑士的最终位置,这是不正确的。您的代码给出了将每个骑士移动到自己的最终位置的正确解决方案,如您给出的数据所示。

这是一个假设结束位置未链接到骑士的答案(任何骑士都可以在任何结束位置结束)。这是一个独立于编程语言的算法问题,所以我不会展示任何代码


最简单但效率最低的方法是假设每个骑士都有一个所需的最终位置。您通过索引将最终位置的所有排列分配给骑士,并为每个排列计算结果。最后,返回最小结果。在您的示例中,一个结果是
6
(原始映射)另一个则是<代码> 4 /代码>(交换最后的位置,唯一的另一个排列),所以你会得到<代码> 4 /代码>。这个方法的问题是,对于n个骑士,你将有n个排列要考虑。< /P>
贪婪的方法是让每个骑士移动直到到达最后一个点,然后让另一个跳到另一个点。这对你的例子来说是可行的,但对这个例子来说是错误的:

  • 骑士:(5,4)、(2,1);最后位置:(3,3)、(9,6)
第一个骑士会移动

  • (5,4)->(3,3)
完成后(1步),第二个骑士必须移动

  • (2,1)->(4,2)->(5,4)->(7,5)->(9,6)
这需要4个步骤,总共
5
。但是,最佳解决方案是:

  • (5,4)->(7,5)->(9,6)
  • (2,1)->(3,3)
这是三个步骤。所以我们看到,一个幼稚的贪婪算法不一定能得到正确的结果


然而,我们可以用贪婪的方法做得更好:首先,计算每个骑士/最终位置对之间的距离,并存储它们(使用原始算法)

我们前面的示例如下所示:

(5,4)        <- first knight
  (3,3) = 1  <- distance to first final position
  (9,6) = 2  <- distance to second final position
(2,1)        <- second knight
  (3,3) = 1
  (9,6) = 4

(5,4)但是如何编辑代码以获得答案4?当正确答案为
6
时,为什么要获得
4
?请看,我可以告诉您如何修改代码,使其始终输出
4
,但这对您没有帮助。如果正确答案不是
6
,请更新问题描述以澄清错误原因ect答案应该是
4
。取决于象棋马的数量(我们从控制台输入的数量),可以是1和2,甚至是10(我只是在示例中没有显示)。一切都很好,但对于两个或更多的象棋马,我无法写出我解决的任务的答案,答案是