我有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 :)
这个想法是,给定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的所有数字,你会怎么做?嗯,这很容易,因为:你知道一个简单的方法来把它们整理好。你可以给我下一个给任何一个。你知道哪个是第一。所以你从第一个开始,然后继续下一个,直到完成为止。
同样的方法也适用于这个问题。你需要三种算法:
-
一种算法,对输出进行排序,使每个输出大于或小于其他可能的输出。(您不需要对此进行编码,只需理解即可。)
-
一种算法,用于将任何输出转换为下一个输出,如果给定最后一个输出则失败。(您确实需要对此进行编码。)
-
生成第一个输出的算法,比其他可能的输出少一个(根据第一个算法)。(您确实需要对此进行编码。)
那么很简单:
-
生成第一个输出(使用算法3)。输出。
-
使用增量算法(算法2)生成下一个输出。如果没有下一个输出,请停止。否则,输出。
-
重复步骤2。
更新:以下是一些可能的算法:
算法1:
-
比较两个输出的前几位。如果其中一个大于另一个,则输出更大。如果相等,继续
-
重复步骤移动到连续的数字,直到我们发现不匹配为止。
算法2:
-
从最右边的数字开始。
-
如果该数字不是最大值,则将其递增并停止。
-
我们在最左边的数字吗?如果是,请停止并出错。
-
将数字指针向左移动一位。
算法3:
- 将所有数字设置为零
“我正试图写一个程序,如果我有n个空间,并且可以在其中任何一个空间中放置从0到m的任何数字,它会给我所有可能的结果”
假设包含“至";,设R=m+1。
则这同构于输出在基R数字系统中出现的从0到Rn-1的范围内的每个数字。
这意味着要计数一个外循环(为此,您可以使用C++++
增量运算符),以及提取和显示数字的一个内循环。对于内部循环,您可以使用C++;/
除法运算符,并且根据您发现的最清楚的内容,还有%
余数运算符。除非您将自己限制为C++标准库直接支持的R的三个选项,否则在这种情况下,请使用标准格式化程序。
注意,Rn可以快速变大。
因此,不要将输出重定向到打印机,并准备等待一段时间等待程序完成。
我认为您需要查找递归。http://www.danzig.us/cpp/recursion.html
基本上,它是一个调用自身的函数。这允许您执行N个嵌套for循环。
- 使用另一个字符串从字符串中删除空格
- 当字符串中只有一个"GOOD"字符串可用时,从没有空格的字符串中提取第一个单词的最佳和有效方法?
- 使用 fstream 在空格分隔文件中查看下一项(不仅仅是一个字符)的方法
- 如何使用循环从另一个字符串创建一个没有空格的新字符串
- 缓冲区用不需要的数据填充 char 数组中的最后一个空格
- 如何使用 << 添加一个空格来填充带有 ofstream 的减号?
- 我正在尝试在字符数组的中间添加一个空格.不确定如何正确移动它
- 查找下一个文件失败,出现空格字符
- 我有n个空格,在每个空格中,我可以放置一个数字0到m.编写一个程序来输出所有可能的结果.需要帮助:)
- 如何添加一个空格字符来触发 var args c++ execlp()
- 我正在尝试在下划线之间创建空格,这代表一个秘密短语
- 如何在 c++ 中使用 STL 将带有空格的字符串连接成一个字符串
- boost regex空格后跟一个或多个星号
- KDevelop 会自动在 #include < file.h 中的 # 后插入一个空格>
- 三个整数组成一个带空格的字符串;
- 打开文本文件并读取一个带有空格的字符串,然后将两个独立的int放入一个结构中
- 是否有一个WinAPI可以从带有可选空格和其他参数的命令行获取文件名
- 从.txt文件中读取多个数据类型,其中一个字符串有空格C++
- 使用string.at()在字符串c++中查找一个空格
- 在Boost Spirit Qi中,我如何将每个字符匹配到下一个空格(带有预跳过)