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(我只是在示例中没有显示)。一切都很好,但对于两个或更多的象棋马,我无法写出我解决的任务的答案,答案是