编写循环以更改具有不同名称的 int 数组中的值
Posted
技术标签:
【中文标题】编写循环以更改具有不同名称的 int 数组中的值【英文标题】:Writing a loop to change the value in a int array with different names 【发布时间】:2012-10-25 05:00:52 【问题描述】:我的标题有点混乱,但我正在尝试编写一个循环来更改 81 个具有不同名称的数组中的值。我想用一个值或一个值数组启动数组。这是我的数独求解器代码的一部分,因为我认为我解释得不好。
int cell1[], cell2[9], cell3[9],cell4[9]......cell81[9]; // <-- this will make 81 cells with an array that can hold a possible of 9 candidates
cout << "User input: << endl; // lets use ...1.5...14....67..8...24...63.7..1.9.......3.1..9.52...72...8..26....35...4.9...
// as an example
假设我将该输入存储到一个字符数组中,并且我将使用一个循环来决定是启动给定值还是“。”作为一个空值。
对于空值,我希望用 1-9 个值初始化数组。我可以用这段代码轻松做到这一点。
If( ( (int)charArray[ 0 ] - 48) > 0 ) // type cast to int. Neg = initialize array with 1-9
// pos = initialize with original value
cell1[ 0 ] = (int)charArray[ 0 ] - 48;
else
cell1[ 9 ] = 1,2,3,4,5,6,7,8,9;
我想避免为 81 个单元格编写此代码 81 次(被视为编写垃圾代码)。我不知道如何编写循环。我愿意接受有关如何使用类、函数等进行不同编码的建议。提前致谢。
【问题讨论】:
我想尽可能避免使用 2D 数组,因为它们似乎会导致比解决方案更多的问题。 (至少对我来说) 如果二维数组有问题,请尝试std::vector<std::vector<int> >
。
只有一个提示。也许没有必要使用数组来表示数字。相反,可以使用位掩码,因为单元格内容实际上是一个无序的 set。 1,2,3 = 1negative 值来表示已解决或固定的单元格)。
【参考方案1】:
将cell
数组创建为二维数组,包含 81 行和 9 列。
int cell[81][9];
现在您可以使用语法cell[r][c]
遍历它们。例如,
for( i = 0; i < 81; ++i )
cell[i][0] = 1;
// ...
cell[i][8] = 9;
如果您希望避免使用二维数组,可以将数组声明为一维数组,然后适当地对其进行索引。
int cell[81 * 9];
for( i = 0; i < 81; ++i )
cell[i + 0*81] = 1;
// ...
cell[i + 8*81] = 9;
【讨论】:
非常聪明。我将不得不尝试一下,看看它如何与我的程序一起使用。谢谢 @uBuntunoob 抱歉,我完全搞砸了将下标转换为线性索引的数学运算。现在已经修好了。 你之前使用的方式是正确的。 “细胞[我 *81 + 0] = 1”。感谢您的帮助 @uBuntunoob 仅当您从 [0 .. 8] 循环 i 时,而不是我编写循环的方式。否则,当i == 80
时,您将索引元素 6480
,这超出了数组的范围。
嗯。好的,我会再次尝试使用该代码。只是要清楚。 I = 位置,0-8 = 索引,81 = 数组大小?【参考方案2】:
int a1[9],a2[9],a3[9],a4[9],...
void init_array(int *ptr, const char *chr, int len, int start)
for(int i = start; i < len; i++)
if(chr[i] == '.')continue;
ptr[i] = chr[i]-'0';//converts character to integer.
int main(int argc, char **argv)
std::string str;
cin >> str;
init_array(a1,str.c_str(),9,0); init_array(a2,str.c_str(),9,9/*increment by 9*/);...
//..
return 0;
编写一个名为init_array()
的函数,它接受一个整数指针并为您初始化数组。这样可以避免重复代码。
【讨论】:
以上是关于编写循环以更改具有不同名称的 int 数组中的值的主要内容,如果未能解决你的问题,请参考以下文章