如何确定阵列100的数量彼此不相等

时间:2013-10-06 07:27:56

标签: c++ c arrays

我正在编写一个Sudoku程序。我发现数组中的数字决定了重复是否很难。

现在我有一个数组:int streamNum[SIZE]

  • 如果SIZE = 3,我可以像if(streamNum[0]!=streamNum[1])...
  • 一样处理这个问题
  • 如果SIZE = 100,我认为我需要一个更好的解决方案,有没有标准做法?

3 个答案:

答案 0 :(得分:1)

有几种不同的方法可以做到这一点,我想最容易写两个循环

bool has_duplicate = false;
for (int i = 0; i < SIZE && !has_duplicate; ++i)
    for (int j = i + 1; j < SIZE && !has_duplicate; ++j)
        if (streamNum[i] == streamNum[j])
            has_duplicate = true;
if (has_duplicate)
{
    ...
}
else
{
    ...
}

第一个循环遍历数组中的每个元素,第二个循环检查数组的其余元素是否存在重复(这就是它从i + 1开始的原因)。一旦找到副本(这就是&& !has_duplicate的作用),两个循环都会退出。

这不是最有效的方法,更有效的方法是在查找重复项之前对数组进行排序,但这会同时修改数组的内容。

我希望我能够很好地理解你的要求。

答案 1 :(得分:1)

for(int i=0;i<size;i++){
    for(int j=i+1;j<size;j++){
        if(streamNUM[i]==streamNUM[j]){
           ...........
        }
     }
}

我认为你需要是否有重复这可能会有所帮助

如果没有评论

答案 2 :(得分:0)

有点不清楚你到底想要做什么,但我假设它是数独你只对存储数字1-9感兴趣?

如果是这样来测试副本,你可以遍历源数组并使用第二个数组(有9个元素 - 我称之为标志)来保存一个标志,显示每个数字是否已被使用。

所以...类似:

for (loop=0;loop<size;loop++) {
    if (flag[streamNum[loop]]==true) {
        //duplicate - do something & break this loop
        break;
    }
    else {
       flag[streamNum[loop]=true;
    }
}

这是我如何测试数独规则 - 它使用上面的想法检查水平,垂直和3x3块,但这里有3个规则的3个不同的标志数组。这假设您的标准网格保持在81个元素的数组中。您可以轻松地对其进行调整,以满足部分完成的网格..

for (loop=0;loop<9;loop++) {
    flagH=[];
    flagV=[];
    flagS=[];

    for (loop2=0;loop2<9;loop2++) {
        //horizontal
        if(flagH[streamNum[(loop*9)+loop2]]==true) {
           duplicate
        else {
           flagH[streamNum[(loop*9)+loop2]]=true);
        }

        //column test
        if(flagV[streamNum[loop+(loop2*9)]]==true) {
        ..same idea as above

        //3x3 sub section test
        basecell = (loop%3)*3+Math.floor(loop/3)*27; //topleft corner of 3x3 square
        cell = basecell+(loop2%3+(Math.floor(loop2/3)*9));
        if(flagS[streamNum[cell]]==true) {
        ..same idea as before..

   }
}