检查二维数组

时间:2017-03-05 23:23:29

标签: c++ multidimensional-array sudoku

所以我在C ++中创建了一个数独有效性检查器程序。该程序接收一个已完成的数独板的csv文件。该程序应该逐行读取文件并将数字放入2d数组(它做得很好)。我在检查连续是否有任何重复的数字时遇到困难(我假设如果我可以使这个工作,那么列应该非常相似)。我知道算法应该如何在我脑海中起作用,但我似乎无法将其纳入代码。

算法:

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;
        }
    }
}

2 个答案:

答案 0 :(得分:2)

我能想到的最简单的方法是2个循环(一个在另一个内部):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.
}

当然,还有其他方法可以做到这一点,这个方法非常基础且很慢。

------------------------------------- EDIT --------- ----------------------------------

您的功能应为bool,以便知道是否有重复的数字。

bool is_row_ok(vector<vector<int> board)//I suggest you use vectors instead of arrays.
{
    //i and j are declared on for, there´s no need to declare them again.
    for (int i = 0; i < 10; ++i) 
    {
        int counter = 0;
        for (int j = 0; j < 9; ++j)
        {
            if(board[row][j] == i)counter++;
            if(counter > 1)return false;
        }
    }
return true;
}

现在你在main上调用这个函数。如果函数返回true,则一切正常,如果返回false,则表示您有重复的数字。

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

答案 1 :(得分:0)

我认为最简单的方法是使用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;
}

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