2017-03-05 28 views
-2

で妥当性をチェックしていますので、私はC++でsudoku有効性チェッカープログラムを作成しています。プログラムは既に完成したスドクボードを持つcsvファイルを取り込みます。プログラムはファイルを1行ずつ読み込み、数値を2次元配列に格納することになっています(これはうまくやっています)。私は、行に重複した数字があるかどうかをチェックすることに固執しています(私はこの仕事を得ることができれば、列はかなり似ているはずです)。私はアルゴリズムが私の頭の中でうまくいくはずですが、私はちょうどそれをコードに入れることはできません。2次元配列

アルゴリズム:

1)それぞれの行を見て、彼らは唯一のすべてであれば(一度に表示されていることを確認してから9までの数字1をチェック)

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

答えて

0

は、私が最も簡単な方法は、範囲の新しい終了までstd::sort + std::uniqueuniqueとして返すイテレータを使用することだと思います。

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

これは単なる例ですが、あなたはその考えを得るべきです。

1

私が考えることができる最も簡単な方法は、2つのループ(別のものの中に1つあります)です:1は数字の1から9までを取得し、もう1つは行の要素を通過します。コード付きの小さなチップ。

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を返す場合はすべてOK、falseを返す場合は繰り返し数を返します。

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

私は上記のコードを実装していくつかの印刷ステートメントを追加しました。実行したときには、 "Before 0"と "1"の繰り返しを印刷しました。私は何か間違ったことをしましたか –

+0

カウンターを印刷しています。カウンターは0または1です。2の場合、ループを終了します。はい、OKです。私はあなたがブール値を使用しているのを見ます。コードを編集して機能させるようにします。 – Capie