Algorithm 找出所有可能位置的算法

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

我需要一个算法来找出棋盘上一组棋子的所有可能位置。就像找到N个零件位置的所有可能组合一样

例如,在一个像笛卡尔坐标系一样编号的棋盘上,任何棋子都会处于一个位置

(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);
       }
    }