注:実際の質問については、一番下までスキップしてください
やあみんな、今私は数独プログラムを解決するための基本的な方法を知っている轍にいますが、私がそれをやったら、それがいかに醜く、長く、そして多くの不要なコードになるかを知っています。
右私はsudoku.cc、sudokuboard.cc、sudokuboard.h、stack.cc、stack.hを持っているので、今のところ、stack.ccとstack.hはかなり一般的であるため、問題ではありません。そして、誰もがそれらのプログラムを見つけることができ、率直に言って、なぜ私がstack.cc/hを含める必要があるのか理解できません。
現在の私の数独.ccは次のとおりです。
#include <iostream>
#include <cassert>
#include <fstream>
#include "sudokuboard.h"
#include "stack.h"
using namespace std;
int main (void)
{
FILE *fp = fopen("test.txt","r");
char sudoku_grid[9][9];
char ch;
if(fp != NULL)
{
for(int i = 0; i < 9; i++)
{
for(int j = 0; j < 9; j++)
{
ch = fgetc(fp);
sudoku_grid[i][j] = ch;
}
ch = fgetc(fp);
}
for(int i = 0; i< 9;i++)
{
for(int j= 0; j<9;j++)
cout<<sudoku_grid[i][j];
cout<<endl;
}
}
return 0;
}
これまでのところ、私が提供したファイルを印刷して2D配列に格納する以外に何もしていません。
私のsudokuboard.hは
#include <iostream>
#define SDIM 9
class SudokuBoard {
public:
//------------------------------------------------------------------------
SudokuBoard();
// Construct a blank sudoku board
//------------------------------------------------------------------------
//------------------------------------------------------------------------
void print(std::ostream & ostr) const;
// display it. duh.
//------------------------------------------------------------------------
//------------------------------------------------------------------------
void place(size_t r, size_t c, char digit);
// PRE: safe(r,c,digit)
//------------------------------------------------------------------------
//------------------------------------------------------------------------
void remove(size_t r, size_t c, char digit);
// PRE: get(r,c) == digit
//------------------------------------------------------------------------
//------------------------------------------------------------------------
char get(size_t r, size_t c) const;
// Return the digit at (r,c) on the board. or ' ' if blank.
//------------------------------------------------------------------------
//------------------------------------------------------------------------
bool safe(size_t r, size_t c, char digit) const;
//
//------------------------------------------------------------------------
//------------------------------------------------------------------------
bool done() const;
// Return true iff every cell has a number
//------------------------------------------------------------------------
private:
std::string rows[SDIM];
};
と私のsudokuboard.cc:
#include <iostream>
#include <cassert>
#include "sudokuboard.h"
#define ASSERTBOUNDS assert(0 <= r and r < SDIM and 0 <= c and c < SDIM)
SudokuBoard::SudokuBoard()
{
for (size_t i = 0;i<SDIM;i++) {
rows[i] = "";
for (size_t j=0;j<SDIM;j++)
rows[i] += ' ';
}
}
void SudokuBoard::place(size_t r, size_t c, char digit)
{
ASSERTBOUNDS;
assert(safe(r,c,digit));
}
void SudokuBoard::remove(size_t r, size_t c, char digit)
{
ASSERTBOUNDS;
assert(get(r,c)==digit);
rows[r][c] = ' ';
}
char SudokuBoard::get(size_t r, size_t c) const
{
ASSERTBOUNDS;
return rows[r][c];
}
void SudokuBoard::print(std::ostream & ostr) const
{
for (size_t i=0;i<SDIM;i++)
ostr << rows[i] << std::endl;
}
bool SudokuBoard::safe(size_t r, size_t c, char digit) const
{
for(size_t r=0; r<SDIM; r++)
for(size_t c=0; c<SDIM; c++)
if (get(r,c) == digit)
return false;
for(size_t c=0; c<SDIM; c++)
for(size_t r=0; r<SDIM; r++)
if (get(r,c) == digit)
return false;
return true;
}
bool SudokuBoard::done() const
{
for (size_t r=0;r<SDIM;r++)
for (size_t c=0;c<SDIM;c++)
if (rows[r][c]==' ')
return false;
return true;
}
ですから、今のところ、sudokuboard.ccメソッドを使用し、sudoku.ccでSudokuBoard()を使用したいと思います。そうすれば、Sudokuboard.ccが提供する便利なメソッドを使用できるようになり、コードが表示されるようになるからです。 1つのプログラムにすべてが散らかっていないため、非常にクリーンです。
したがって、現時点では、スペースを最大化するためにこれら2つのプログラムをリンクするためのゲートウェイは、 sudoku_gridである現在の2D配列をSudokuboard()の一部に設定する必要があると思います。
問題は、私が文字通りこの子犬をどのように接続するかについてのまばたきの考えを持っていないということです。sudoku_grid = Sudokuboard()を実行できないことはわかっています。これは、機能したとしても、すべての配列が単なるスペースに設定される可能性があるためです。
どこから始めればよいかという解決策はありますか?