Algorithm 找出所有可能位置的算法
我需要一个算法来找出棋盘上一组棋子的所有可能位置。就像找到N个零件位置的所有可能组合一样 例如,在一个像笛卡尔坐标系一样编号的棋盘上,任何棋子都会处于一个位置Algorithm 找出所有可能位置的算法,algorithm,combinations,Algorithm,Combinations,我需要一个算法来找出棋盘上一组棋子的所有可能位置。就像找到N个零件位置的所有可能组合一样 例如,在一个像笛卡尔坐标系一样编号的棋盘上,任何棋子都会处于一个位置 (x,y) where 1 <= x <= 8 and 1 <= y <= 8 (x,y)其中1您得到了8x8板,因此总共有64个正方形。 填充一个包含这64个sqaure的列表[让它成为list],并找到所有的可能性:每个步骤将“猜测”一个点,并调用递归调用来找到其他点 伪代码: choose(list,num
(x,y) where 1 <= x <= 8 and 1 <= y <= 8
(x,y)其中1您得到了8x8板,因此总共有64个正方形。
填充一个包含这64个sqaure的列表[让它成为list
],并找到所有的可能性:每个步骤将“猜测”一个点,并调用递归调用来找到其他点
伪代码:
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
是块数]您可以使用递归算法生成所有可能的:
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);
}
}
void合并(String instr、StringBuffer outtr、int index)
{
对于(int i=索引;i
合并(“abc”,新StringBuffer(),0)正如我所理解的,你应该考虑到一些优势可能会阻碍一些潜在的职位,这些数字可以在空置板上找到。我想这是最棘手的部分。
因此,您应该构建一些顶点集(电路板状态集),这些顶点集是从某个顶点(初始电路板状态)到达的
我想到的第一个算法是:
先决条件:
- 以某种方式将图形排列成圆形
- 假设初始板状态集(S0)包含表示初始板状态的单个元素
行动
选择下一个图形以扩展可能的位置集
对于S(n)范围内的板的每个状态,行走深度优先于新板状态的所有可能运动,并将其称为F(n)(帧)
表S(n+1)=S(n)∪ F(n)
重复步骤,直到整个循环过程中的所有更新帧不为空
这是一种混合呼吸优先和深度优先搜索对位置有任何限制吗?或者你只是想要n个位置的所有可能选择?它们必须是合法的位置吗(例如,一个骑士在白色,一个在黑色,前两个等级没有兵等等?@Nick没有任何限制。我只需要一堆物品的所有可能的配置(我只是添加了国际象棋的例子,以使其更简单,但我希望任何“地图”都能找到元素的所有可能分布)。@DNA不,我不介意它们是否合法。只是两块不能在同一个位置。@Nick唯一的限制是两块不能在同一个位置。+1表示复杂性(n是板的高度和长度,k是块数)。@DaveBall:谢谢,我忘了在回答中提到n
和k
代表什么。我现在编辑了它。
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);
}
}