我正在编写一个Sudoku程序。我发现数组中的数字决定了重复是否很难。
现在我有一个数组:int streamNum[SIZE]
if(streamNum[0]!=streamNum[1])...
答案 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..
}
}