检查2d数组中的有效性 所以我在C++中创建了一个数独有效性检查程序。该程序接收一个csv文件和一个已经完成的数独板。程序应该逐行读取文件,并将数字放入一个2d数组(它做得很好)。我一直在检查一行中是否有重复的数字(我假设如果我能做到这一点,那么列应该相当相似)。我知道算法应该如何在我的脑海中运行,但我似乎无法将其转化为代码

检查2d数组中的有效性 所以我在C++中创建了一个数独有效性检查程序。该程序接收一个csv文件和一个已经完成的数独板。程序应该逐行读取文件,并将数字放入一个2d数组(它做得很好)。我一直在检查一行中是否有重复的数字(我假设如果我能做到这一点,那么列应该相当相似)。我知道算法应该如何在我的脑海中运行,但我似乎无法将其转化为代码,c++,multidimensional-array,sudoku,C++,Multidimensional Array,Sudoku,算法: 1) 查看每一行,检查数字1到9,确保它们只出现一次(如果有) 2) 如果发现重复项(这意味着缺少某个数字),请告诉用户在哪一行和哪一列发现了错误 3) 否则,请转到下一行并再次执行 我认为它应该是一个for循环运行,但是自从我用C++编码了很久,而且在互联网上没有任何东西对我很有帮助。 感谢您的帮助 以下是我目前的代码: #include <iostream> #include <string> #include <fstream> #include

算法:

1) 查看每一行,检查数字1到9,确保它们只出现一次(如果有)

2) 如果发现重复项(这意味着缺少某个数字),请告诉用户在哪一行和哪一列发现了错误

3) 否则,请转到下一行并再次执行

<>我认为它应该是一个for循环运行,但是自从我用C++编码了很久,而且在互联网上没有任何东西对我很有帮助。 感谢您的帮助

以下是我目前的代码:

#include <iostream>
#include <string>
#include <fstream>
#include <sstream>
#include <thread>

using namespace std;

int *board[9];
int row, col;
void printBoard();
void is_row_ok();

int main()
{
    for (int i = 0; i < 9; ++i)
    {
        board[i] = new int[9];
    }
    printBoard();
    is_row_ok();
    cout << endl;
    return 0;
}

void printBoard()
{
    string line;
    string val;
    ifstream myFile("Testfile1.txt");

    for (int row = 0; row < 9; ++row)
    {
        string line;
        getline(myFile, line);
        if (!myFile.good())
            break;

        stringstream iss(line);
        cout << endl;

        for (int col = 0; col < 9; ++col)
        {
            string val;
            getline(iss, val, ',');
            if (!iss.good())
                break;

            stringstream convertor(val);
            convertor >> board[row][col];
            cout << board[row][col] << "  ";
        }
    }
    cout << endl;
    cout << endl;
}
void is_row_ok()
{
    bool found = false;
    int i, j;
    for (int i = 0; i < 10; ++i) //<------ edit starts here
    {
        int counter = 0;
        for (int j = 0; j < 9; ++j)
        {
            if(board[row][j] == i)
            {
                cout << "Before " << counter << endl;
                counter++;
                cout << counter << endl;
            }
            if(counter > 1)
              break;
        }
    }
}
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
国际*董事会[9];
int row,col;
作废印刷板();
void是_row_ok();
int main()
{
对于(int i=0;i<9;++i)
{
板[i]=新的整数[9];
}
印制板();
行吗;
cout board[行][列];

cout我认为最简单的方法是使用
std::sort
+
std::unique
作为
unique
将迭代器返回到范围的新端点

#include <algorithm>
using namespace std;

int main()
{
    int n[15] = { 1, 5, 4, 3, 6, 7, 5, 5, 5, 4, 2, 3, 9, 8, 9 };

    int* end = n + 15;
    sort(n, n + 15);
    bool has_no_duplicates = (unique(n, n + 15) == end);

    return 0;
}
#包括
使用名称空间std;
int main()
{
int n[15]={1,5,4,3,6,7,5,5,5,4,2,3,9,8,9};
int*end=n+15;
排序(n,n+15);
bool没有重复项=(唯一的(n,n+15)=结束);
返回0;
}

这只是一个例子,但你应该明白这一点。

我能想到的最简单的方法是两个循环(一个循环在另一个循环中):1通过数字1到9,另一个通过行的元素。代码小提示

for(int i=1;i<10;i++){
   int counter =0;
   for(int j=0;j<9;j++){
      if(board[row][j] ==i)counter ++;
   }
   if(counter >1) break; //here you check that there´s only one number on the row.
}
现在在main上调用这个函数。若函数返回true,则一切正常;若它返回false,则有一个重复的数字

int main(){
  if(is_row_ok(board)cout<<"No number repeated"<<endl;
  else cout << "Number repeated"<<endl;
  return 0;
}
intmain(){

如果我已经实现了上面的代码并添加了一些打印语句,当我运行它时,它会打印出一堆重复的“0之前”和“1”我做错什么了吗?您正在打印计数器,它是0或1。如果它是2,它将离开循环,所以是的,它可以。我看到您使用的是布尔值。我将编辑我的代码以使其工作。
int main(){
  if(is_row_ok(board)cout<<"No number repeated"<<endl;
  else cout << "Number repeated"<<endl;
  return 0;
}