0

私は数独プログラムを作成しており、次のような test.txt ファイルがあります。

53__7____    
6__195___
_98____6_
8___6___3
4__8_3__1
7___2___6
_6____28_
___419__5
____8__79

「_」は実際にはスペースです。_ を付けた理由は、各行に文字通り 9 文字しかないことがわかるようにするためです。

GRID [行] [列]のようなことをしなければならないと思っていましたが、率直に言って、配列をどのタイプに配置すればよいかわかりません。

GRID[0][0] を出力したい場合は 5 を返し、GRID[0][3] を要求すると ' ' を返すようにしたいだけです。

それはそれを取得しているので、配列は数字とスペースの両方を格納しており、完全に失われています

私が現在これまでに試したこと:

int main()
{
 ifstream myfile(test.txt);
 string line;
 char sudoku_grid[9][9];

 if (myfile.is_open())
 {
  while(myfile.good())
   {
    getline(myfile, line);
    cout << sudoku_grid[line] << endl;
   }
   myfile.close();
  }
 else cout << "error";
 return 0;
}

エラー行 12 が返されます: 「数独_グリッド [行]」 の「演算子 []」に一致しません

これが皆さんのガイドラインによる私の試みです:

int main()
{
 ifstream myfile(test.txt);
 string line;
 char sudoku_grid[9][9];

 if (myfile.good())
 {
  for(int i = 0; i < 9; i++)
   {
    getline(myfile, line);
    for(int j = 0; j < 9; j++)
       {
       if (line[j] == ' ')
          sudoku_grid[j][i] = -1;
       else  sudoku_grid[j][i] = line[i];
       }
    cout << sudoku_grid[i] << endl;
   }
   myfile.close();
  }
 else cout << "error";
 return 0;
}

結果は、奇妙な文字と新しい数字の非常にぎこちない答えです。

4

3 に答える 3

2

アルゴリズム/ロジックを提供するだけで、コードを書くつもりはありません。試してみて、行き詰まったら戻ってきてください。

  1. メモリ 2D 配列の出力を初期化します。numbers[9][9]
  2. ファイルを開く

  3. ファイルに行がなくなるまで: 行i
    b を取得します。行に文字がなくなるまで:
      b1. 行 c
      b2 の各文字を取得します。文字がスペースでない場合はnumbers[i]=c、そうでない場合numbers[i]=-1

配列はintb2 で構成でき、 aが検出された場合は挿入して数値が存在しないことを示すwhitespaceことができます。-1もちろん、numbers配列を操作するコードはそれを考慮する必要があります。

于 2012-10-04T09:52:45.973 に答える
0

char型と整数型の両方の値を格納する必要があるため、charを使用します。各整数は0〜9の範囲にあるため、文字として格納できます。

char Grid[9][9];

これで、文字列から各文字を読み取り、配列に格納できます。それはあなたのスペースを無傷に保つだけでなく、各キャラクターも維持します。グリッドの要素にアクセスするには、常にASCIIコードを使用することを忘れないでください。0〜9の場合、ASCIIコードは48〜57スペースのASCIIコードは32です。

それが役に立てば幸い...

コードの編集:これが最も簡単な例です...テストファイルをd:に配置するか、ファイルのパスをコードで編集します

int main (void)
{
    FILE    *fp = fopen("d:\\test.txt","r");
    char sudoku_grid[9][9], ch;
    // I am assuming that file is valid and data in that is also valid
    if(fp)
    {
        for(int i = 0; i < 9; i++)
        {            
            for(int j = 0; j < 9; j++)
            {
                //too read each character
                ch = fgetc(fp);
                sudoku_grid[i][j] = ch;   
            }
            // to read '\n' from the line
            ch = fgetc(fp);
        }
//for checking if data went correctly
        for(int i = 0; i< 9;i++)
        {
            for(int j= 0; j<9;j++)
                cout<<sudoku_grid[i][j];
            cout<<endl;
        }
    }


 return 0; 
}
于 2012-10-04T09:50:04.570 に答える
0

最初のコードでは、sudoku_grid は文字列ではなく数値によってのみインデックス付けできるため、エラー メッセージが表示されます。

2番目のコードの行

sudoku_grid[j][i] = line[i];

おそらくあるはずです

sudoku_grid[j][i] = line[j];

これはあなたの質問に答えていますか?

于 2012-10-04T11:43:51.950 に答える