-1

注意:真正的问题跳到底部

嘿,伙计们,现在我正处于一个常规中,我知道如何解决我的数独程序的基本知识,但如果我这样做,我知道它会是多么丑陋、冗长和大量不必要的代码。

对,我有 sudoku.cc、sudokuboard.cc、sudokuboard.h、stack.cc 和 stack.h,所以到目前为止,我的 stack.cc 和我的 stack.h 是什么并不重要,因为它们相当通用并且任何人都可以找到他们的程序,坦率地说,我不明白为什么我什至需要包括 stack.cc/h 到期。

我现在的 sudoku.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; 
    }

到目前为止,除了打印出我给它的文件并将其存储在二维数组中之外,它什么也没做。

我的数独板.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];
};

和我的数独板.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 提供的有用方法,从而使我的代码看起来更干净,因为它并没有在一个程序上杂乱无章。

所以到目前为止,我认为将这两个程序链接在一起以最大化我的空间的网关我必须设置我当前的 2D 数组,即sudoku_grid以某种方式成为 Sudokuboard() 的一部分。

问题是我真的不知道如何把这只小狗挂起来。我知道我不能做sudoku_grid = Sudokuboard()因为即使它确实有效,它也可能会将所有数组设置为只是空格。

任何人都有从哪里开始的解决方案?

4

1 回答 1

1

放在主文件的顶部,#include "sudokuboard.h"以便编译器知道它在那里。接下来,在您的顶部,您int main()需要创建一个SudokuBoard类的实例,使用SudokuBoard mainBoard;,然后您可以通过mainBoard.doSomething();主目录中的其他地方访问它的方法。我建议在 SudokuBoard 类中创建一个新方法,该方法从文件中读取数据并将其std::string rows[SDIM];从内部直接放入 SB 的私有数组中(基本上将大部分代码从 main 移动到类中)。使用原样的代码,假设我没有破坏任何名称,这应该可以工作:

#include "sudokuboard.h"

int main (void) {
  SudokuBoard mainBoard;
  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;  
        //set mainBoard's internal state, etc here
        mainBoard.place(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; 
}
于 2012-10-04T11:52:46.673 回答