编写循环以更改具有不同名称的 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&lt;std::vector&lt;int&gt; &gt; 只有一个提示。也许没有必要使用数组来表示数字。相反,可以使用位掩码,因为单元格内容实际上是一个无序的 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 数组中的值的主要内容,如果未能解决你的问题,请参考以下文章

如何在循环中的每次迭代中保存具有不同名称的文件? MATLAB

不同对象中具有相同名称的两个变量改变彼此的值

如果最后一个值不同,如何在循环内分离结果

如何在Java中将变量的值添加到数组中?

单个脚本中的 ClearML 多个任务更改记录的值名称

根据一维数组中的值更改二维numpy数组中的某些值而无需for循环