Вот ситуация:
Пользователь может выбрать до 4 кубиков на столе с диапазоном [1-12] граней, которые они хотят (Да, 1 кубик - это ВЕЩЬ здесь). Затем программа рассчитает все возможные результаты.
Например: 2 кубика, 1-й с 6-ю гранями, 2-й с 2-мя гранями.
Вывод:
Сумма 2 =1
Сумма 3 = 2
Сумма 4 = 2
Сумма 5 = 2
Сумма 6 = 2
Сумма 7 = 2
Сумма 8 = 1
Я нашел схему для расчета со всеми возможностями с различными из нет. кубиков и граней, которые у них есть, вот иллюстрация:
4 кубика с гранями [6, 2, 3, 4] соответственно
Нажмите здесь, чтобы проверить шаблон
Синяя область - игральные кости с 6 гранями. Зеленая область - 6 граней, в 2 раза. Желтая область - зеленая область, петля - в 3 раза. Область чтения - желтая область, петля - 4 раза
. подсчет появления каждой суммы и она правильная все время, независимо от того, какие входные данные.
Каждая новая область будет начинаться с id [5] и после каждой итерации область процесса будет сдвигаться [i + 1]до конца.
Однако я много раз пытался и до сих пор не могу найти правильный способ внедрения этого шаблона в программу на c ++.
Мои коды такие:
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
int num, face, faceCounter;
int faces[15] = { 0 }, counter1[150] = { 0 }, tempCount[150] = { 0 };
cout << "How many dices: ";
cin >> num;
for (int i = 1; i <= num; i++) {
cout << "Face for dice number: " << i;
cin >> face;
faces[i] = face; //Store number of face into each dice
faceCounter += face; // Store how many outputs needed
}
// Calculate the first iteration of dices
for (int k = 0; k < faces[2]; k++) {
for (int j = num + k; j < (num + faces[1] + k); j++) {
tempCount[j]++;
}
}
// Copy results into counter1[]
for (int i = num; i <= faceCounter; i++) {
counter1[i] += tempCount[i];
}
// Find out the remaining dices
for (int i = 2; i < num; i++) {
for (int k = 0; k < faces[i+1]; k++) { // Calculate the count range
for (int j = num + k + 1; j < (num + faces[i] + k); j++) { // Add the previous counter's value into temp counter
tempCount[j] += counter1[i];
}
if (k == faces[i + 1] - 1) // Make sure finished the for loop first then to final addition, won't duplicate data
finished = 1;
}
//Load results back to counter, which will using it back in loop for further counting
for (int i = num; (i <= faceCounter) && (finished = 1); i++) {
counter1[i] += tempCount[i];
}
finished = 0;
}
for (int i = num; i <= faceCounter; i++) {
cout << "Sum of " << i << " = " << counter1[i] << endl;
return 0;
}
Это не работает, хотя.
Мой желаемый вывод:
Sum of 4 = 1
Sum of 5 = 4
Sum of 6 = 9
Sum of 7 = 15
Sum of 8 = 20
Sum of 9 = 23
Sum of 10 = 23
Sum of 11 = 20
Sum of 12 = 15
Sum of 13 = 9
Sum of 14 = 4
Sum of 15 = 1
Как я могу изменить его?