找出所有可能位置的算法

时间:2012-02-26 19:07:03

标签: algorithm combinations

我需要一个算法来找出棋盘中一组棋子的所有可能位置。就像找到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);
    }
}

我怎样才能找到一个好的算法来找到棋子中所有可能的位置?

感谢。

3 个答案:

答案 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)

据我所知,你应该考虑到一些可能会阻止一些可能在空板上达到它们的数字的位置。我想这是最棘手的部分。 因此,您应该构建一些从一些单个顶点(初始板状态)到达的顶点集(一组板状态)。

我想到的第一个算法:

前提条件:

  • 以某种方式订购数字以形成圈子。
  • 假设初始板组状态(S0)包含表示初始板状态的单个元素。

操作

  1. 选择下一个图来扩展可能的位置集
  2. 对于S(n)步行深度内的每个状态,首先是新董事会所说的所有可能的动作,并称之为F(n)(框架)。
  3. 形式S(n + 1)= S(n)×F(n)。
  4. 重复步骤,直到整个圆圈过程中的所有更新帧都不为空。
  5. 这是混合呼吸优先和深度优先搜索