如何解决用 Java 打印骰子组合
对于一个项目,我需要找到一种方法来打印每一种方式来滚动 5 个 6 面骰子,顺序不重要。我尝试过使用嵌套的 for 循环,但我知道这是打印排列而不是组合:
int counter = 0;
for(int i=1; i<7; i++) {
for(int m = 1; m<7; m++) {
for(int j = 1; j<7; j++) {
for(int k = 1; k<7; k++) {
for(int h = 1; h<5; h++) {
System.out.printf("%2d%2d%2d%2d%2d",i,m,j,k,h);
counter++;
System.out.println(" "+counter);
}
}
}
}
}
有没有有效的方法来做到这一点?
编辑:我应该补充一点,这是针对 Java 的!谢谢!
再次编辑:是的,我的意思是 5 个骰子,每个骰子有 6 个面。抱歉造成混乱
解决方法
如果顺序不重要,请尝试:
for (int i = 1; i < 7; i++) {
for (int m = i; m < 7; m++) {
for (int j = m; j < 7; j++) {
...
所有骰子都一样,发布的代码只显示第一个 3 个
也就是说,初始值永远不会小于前一个骰子的值 - 结果将被排序。
(例如,仅考虑 2 个骰子,这将消除像 2 1
或 3 1
这样的结果,但允许 1 1
、1 2
和 {{1 }})
注意:更容易阅读 (IMO):1 3
考虑这个带有两个六面骰子的简化示例:
for (int i = 1; i <= 6; i++)
for (int j = 1; j <= 6; j++)
System.out.println(i + " " + j);
这将输出 36 (6^2) 个组合。但很多都是重复的。例如,一对数1 2
和2 1
基本相同。如果您只能计算 UNIQUE 对怎么办?在运行上述代码时列出的 36 个对中,只有 21 个是唯一的组合。那么,你会怎么做呢?
for (int i = 1; i <= 6; i++)
for (int j = i; j <= 6; j++)
System.out.println(i + " " + j);
在内部循环中,我以 i
而不是 1 的值开始每次迭代。这是做什么的?在第一次迭代中,您将只打印出唯一的对。但是,在随后的迭代中,我需要消除一个已经滚动的数字。我通过使用 i
的当前起始值启动内循环来做到这一点。这保证没有重复的对。例如,在第二次迭代中,我通过从当前 i
值 2 开始来消除“1”的值;它消除了重复的 2 1
对,并以 2 2
开始第二轮。到最后一次迭代时,只会打印出剩下的唯一一对:6 6
。
这很简单。但是,添加另一个骰子如何影响解决方案?采取同样的方法。使用直接外循环的计数器变量的值开始最内层循环,如下所示:
for (int i = 1; i <= 6; i++)
for (int j = i; j <= 6; j++)
for (int k = j; k <= 6; k++)
System.out.println(i + " " + j + " " + k);
此解决方案仅打印出 56 个组合,而不是 216 个 (6^3)。这是一个巨大的性能改进。用更多的内循环来预测改进。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。