我需要一个算法来找出棋盘中一组棋子的所有可能位置。就像找到N个部分的位置的所有可能组合一样。
例如,在编号类似于笛卡尔坐标系的棋盘中,任何棋子都处于某个位置
(x,y) where 1 <= x <= 8 and 1 <= y <= 8
我希望得到一种算法,例如可以计算3块棋盘中棋子的所有可能位置。但我不知道如何以任何顺序获取它们。我可以获得单件的所有可能位置,但我不知道如何将它们与更多碎片混合。
for(int i = 0; i<= 8; i++){
for(int j = 0; j<= 8; j++){
System.out.println("Position: x:"+i+", y:"+j);
}
}
我怎样才能找到一个好的算法来找到棋子中所有可能的位置?
感谢。
答案 0 :(得分:3)
你有8x8板,总共有64个方块。
填充包含这64个平方的列表[让它为list
],并找到所有可能性recursively:每个步骤将“猜测”一个点,并调用recursve调用以查找其他要点。
伪代码:
choose(list,numPieces,sol):
if (sol.length == numPieces): //base clause: print the possible solution
print sol
return
for each point in list:
sol.append(point) //append the point to the end of sol
list.remove(point)
choose(list,numPieces,sol) //recursive call
list.add(point) //clean up environment before next recursive call
sol.removeLast()
使用choose(list,numPieces,[])
进行调用,其中list
是包含64个元素的预填充列表,numPieces
是您要放置的部分。
注意:此解决方案假设部分不相同,因此[(1,2),(2,1)]
和[(2,1),(1,2)]
都是不同的解决方案。
修改强>
只是关于复杂性的一句话,因为你的问题有(n^2)!/(n^2-k)!
个可能的解决方案 - 而且你正在寻找所有这些解决方案,任何算法都会受到指数运行时间的影响,所以试着只用10来调用它件,需要约400年
[在上面的表示法中,n
是棋盘的宽度和长度,k
是棋子数
答案 1 :(得分:0)
您可以使用递归算法生成所有可能性:
void combine(String instr, StringBuffer outstr, int index)
{
for (int i = index; i < instr.length(); i++)
{
outstr.append(instr.charAt(i));
System.out.println(outstr);
combine(instr, outstr, i + 1);
outstr.deleteCharAt(outstr.length() - 1);
}
}
combine(“abc”,new StringBuffer(),0);
答案 2 :(得分:0)
据我所知,你应该考虑到一些可能会阻止一些可能在空板上达到它们的数字的位置。我想这是最棘手的部分。 因此,您应该构建一些从一些单个顶点(初始板状态)到达的顶点集(一组板状态)。
我想到的第一个算法:
前提条件:
操作
这是混合呼吸优先和深度优先搜索