我有n个空格,在每个空格中,我可以放置一个数字0到m.编写一个程序来输出所有可能的结果.需要帮助:)

I have n spaces, in each space, I can place a number 0 through m. Writing a program to output all possible results. Need help :)

本文关键字:空格 一个 程序 输出 帮助 结果 有可能 数字 我可以 我有      更新时间:2023-10-16

这个想法是,给定n个空格、空字段,或者你有什么,我可以放在从0到m的任意一个数字中。所以,如果我有两个空格,只有01,结果会是:(0 1)(1 0)(0 0)(1 1)

如果我有两个空格和三个数字(0 1 2),结果将是

(0 1)(1 1)(0 2)(2 0)(2 2)(2 1)

等等,直到我得到了所有9(3^2)个可能的结果。

所以我想写一个程序,如果我有n个空间,并且可以在其中任何一个空间中放置从0到m的任何数字,它会给我所有可能的结果。

最初我想用for循环,但当我意识到我必须为n之前的每个数字做一个循环时,这很快就被否决了,而且它不适用于n更大的情况。

我有一个想法,使用随机数生成器生成一个从0到m的数字,但这并不能保证我真的会得到所有可能的结果。

我被卡住了:(

想法?

非常感谢您的帮助:)

基本上,您需要的是一个起点、终点以及从每个状态转换到下一个状态的方法。例如,一个递归函数,它可以将一个数字添加到所需的最小配速值上,当它大于最大配速值时,可以增加下一个较大的数字,并将当前数字设置回零。

举个例子:

#include <iostream>
#include <vector>
using namespace std;
// This is just a function to print out a vector.
template<typename T>
inline ostream &operator<< (ostream &os, const vector<T> &v) {
bool first = true;
os << "(";
for (int i = 0; i < v.size (); i++) {
if (first) first = false;
else os << " ";
os << v[i];
}
return os << ")";
}
bool addOne (vector<int> &nums, int pos, int maxNum) {
// If our position has moved off of bounds, so we're done
if (pos < 0)
return false;
// If we have reached the maximum number in one column, we will
// set it back to the base number and increment the next smallest number.
if (nums[pos] == maxNum) {
nums[pos] = 0;
return addOne (nums, pos-1, maxNum);
}
// Otherwise we simply increment this numbers.
else {
nums[pos]++;
return true;
}
}
int main () {
vector<int> nums;
int spaces = 3;
int numbers = 3;
// populate all spaces with 0
nums.resize (spaces, 0);
// Continue looping until the recursive addOne() function returns false (which means we
// have reached the end up all of the numbers)
do {
cout << nums << endl;    
} while (addOne (nums, nums.size()-1, numbers));
return 0;
}

每当任务需要找到"所有"东西时,您应该首先尝试按以下三个步骤来完成:我可以按某种顺序排列它们吗?我能找到下一个给定的吗?我能找到第一个吗?

所以,如果我让你给我从1到10的所有数字,你会怎么做?嗯,这很容易,因为:你知道一个简单的方法来把它们整理好。你可以给我下一个给任何一个。你知道哪个是第一。所以你从第一个开始,然后继续下一个,直到完成为止。

同样的方法也适用于这个问题。你需要三种算法:

  1. 一种算法,对输出进行排序,使每个输出大于或小于其他可能的输出。(您不需要对此进行编码,只需理解即可。)

  2. 一种算法,用于将任何输出转换为下一个输出,如果给定最后一个输出则失败。(您确实需要对此进行编码。)

  3. 生成第一个输出的算法,比其他可能的输出少一个(根据第一个算法)。(您确实需要对此进行编码。)

那么很简单:

  1. 生成第一个输出(使用算法3)。输出。

  2. 使用增量算法(算法2)生成下一个输出。如果没有下一个输出,请停止。否则,输出。

  3. 重复步骤2。

更新:以下是一些可能的算法:

算法1:

  1. 比较两个输出的前几位。如果其中一个大于另一个,则输出更大。如果相等,继续

  2. 重复步骤移动到连续的数字,直到我们发现不匹配为止。

算法2:

  1. 从最右边的数字开始。

  2. 如果该数字不是最大值,则将其递增并停止。

  3. 我们在最左边的数字吗?如果是,请停止并出错。

  4. 将数字指针向左移动一位。

算法3:

  1. 将所有数字设置为零

“我正试图写一个程序,如果我有n个空间,并且可以在其中任何一个空间中放置从0到m的任何数字,它会给我所有可能的结果”

假设包含“至";,设R=m+1。

则这同构于输出在基R数字系统中出现的从0到Rn-1的范围内的每个数字。

这意味着要计数一个外循环(为此,您可以使用C++++增量运算符),以及提取和显示数字的一个内循环。对于内部循环,您可以使用C++;/除法运算符,并且根据您发现的最清楚的内容,还有%余数运算符。除非您将自己限制为C++标准库直接支持的R的三个选项,否则在这种情况下,请使用标准格式化程序。

注意,Rn可以快速变大。

因此,不要将输出重定向到打印机,并准备等待一段时间等待程序完成。

我认为您需要查找递归。http://www.danzig.us/cpp/recursion.html

基本上,它是一个调用自身的函数。这允许您执行N个嵌套for循环。

相关文章: