从[0,0,0]到[30,30,30]的所有可能方式

时间:2015-12-15 20:50:18

标签: java permutation

对于部落战争游戏,我想知道如何解决以下问题:从0级开始有3栋建筑物。您可以升级建筑物,将其等级从0增加到1,最高可达30。

由于您可以独立于其他建筑物的水平升级建筑物,因此建筑物水平有30 * 30 * 30种组合...

这些组合的输出将是:

0/0/0  
0/0/1  
0/0/2  
...  
0/0/30  
0/1/0  
[0,1,1]  
...  
0/1/30  
0/2/0  
0/2/1  
...  
0/2/30  
...  
0/30/0  
...  
0/30/30]  
1/0/0  

等等,直到30/30/30 ......

此输出的代码将是一个简单的循环回路循环!

但是:这不是我们想要的!

我想要的是获得这些组合的方法,例如组合[1,1,1]有6种(=!3)可能的方式来达到这种组合(“a”=升级第一栋建筑,“b”=升级第二栋楼,“c”升级第3栋楼):

a -> b -> c  
a -> c -> b  
b -> a -> c  
b -> c -> a  
c -> a -> b  
c -> b -> a  

请注意,这6种方式都会产生相同的结果 - 所有建筑物都升级了一次。现在,要达到所有建筑物的30级,我必须将它们中的每一个升级30次,这意味着最终我们进行了30 * 3次升级。

达到目标的方法是:

a -> a -> a -> ... -> a -> b -> b -> ... -> b -> c -> ... -> c  

我认为我需要的是一个包含90个元素的数组,包含3个元素(每个30次),然后我需要这90个元素的每个可能的顺序......

我该怎么做?

提前致谢!

微米。 M.

2 个答案:

答案 0 :(得分:0)

不完全确定你在寻找什么,但是:

// you can store whatever you desire for these buildings
int[][][] buildings = new int[30][30][30]; 

// go through each possible level combination and print it
for(int i = 0; i < 30; i++) {
   for(int j = 0; j < 30; j++) {
      for(int k = 0; k < 30; k++) {
           buildings[i][j][k]; // at this point, do whatever you want with the array
           System.out.println("Building1: " + "i + " Building2: " + j " " + " Building3 " + k);
      }
   }
}

如果您要查找的是打印出可能的级别方案,则可以删除buildings数组。

答案 1 :(得分:0)

如果我理解得很好,并且可以将建筑物从一个层面升级到另一个层面,而没有其他层面建造在某个层面,那么更多的可能性。实际上可以建造31 * 31 * 31种建筑物。

如果这就是你在这里所说的简单嵌套for循环:

    for (int a = 0; a <= 30; a++) {
        for (int b = 0; b <= 30; b++) {
            for (int c = 0; c <= 30; c++) {
                System.out.println("Building A: " + a + " Building B: " + 
                        b + " Building C: " + c);
            }
        }
    }

修改 现在我看到你在找什么。你的问题实际上是图遍历。您希望查找从节点[0,0,0]到节点[30,30,30]的所有可能路径。在这种情况下,您必须实现简单的搜索算法。我推荐Depth First Search或广度优先搜索。在维基百科上链接到他们的页面(你会发现伪代码)

https://en.wikipedia.org/wiki/Breadth-first_search https://en.wikipedia.org/wiki/Depth-first_search

希望有所帮助