申し分なく、私の問題は、数独プログラムを使用している状況でどこに行くべきかわからないことです。現在、私は複数のプログラムを連携させて数独プログラムを作成しています。この数独プログラムは、スペースでも数字でも、それぞれ 9 文字の 9 行の入力を受け取ることが想定されています。例:
53 7
6 195
98 6
8 6 3
4 8 3 1
7 2 6
6 28
419 5
8 79
プログラムがもたらすものは次のとおりです。
534678912
672195348
198342567
859761423
426853791
713924856
961537284
287419635
345286179
私の現在のプログラムは、ファイルstack.h、stack.cc、sudokuboard.h、sudokuboard.cc、sudoku.cc、およびMakefile、およびtest.txtで構成されています(上記の入力例で構成されています)
プログラム stack.h:
struct Node {
StackElementType data;
Node *next;
};
class Stack {
public:
Stack(); //constructor
~Stack(); //deconstructor
Stack(const Stack & orig); // copy constructor
void output(ostream & ostr) const; //output method
bool empty() const; // if empty returns true
void push(const StackElementType & item); // puts new item on top of stack
void pop(); // removes top element of nonempty stack
StackElementType top() const; // returns copy of top element of a stack
private:
Node*first;
size_t _size;
}
私のコードを直接コピーすることができないため、これにはスペルミスがある可能性があることに注意してください。
私のstack.ccは
#include "stack.h"
#include <cstdlib>
#include <cassert>
void destroy(Node *p)
{
// delete all nodes dominated by p.
while (p != NULL) {
Node *old = p;
p = p->next;
delete old;
}
}
Node *copy(Node *p)
{
// Make a deep copy of linked list dominated by p.
Node *result = NULL;
if (p != NULL) {
result = new Node;
Node *last = result;
while (p != NULL) {
// invariant: last points to a node ready to receive p's data.
last->data = p->data;
last->next = NULL;
p = p->next;
if (p != NULL) {
// there's going to more to this copy. Get it ready.
last->next = new Node;
last = last->next;
}
}
}
return result;
}
Stack::Stack()
{
first = NULL;
}
Stack::~Stack()
{
destroy(first);
}
Stack::Stack(const Stack & orig)
{
first = copy(orig.first);
}
Stack & Stack::operator=(const Stack & rhs)
{
if (this != &rhs)
first = copy(rhs.first);
return *this;
}
void Stack::output(ostream & ostr) const
{
ostr << "<";
for(Node *p = first;p;p=p->next) {
ostr << p->data;
if (p->next)
ostr << ", ";
}
ostr << ">";
}
void Stack::push(const ElementType & item)
{
Node *born = new Node;
born->data = item;
born->next = first;
first = born;
}
void Stack::pop()
{
assert(!empty());
Node *rest = first->next;
delete first;
first = rest;
}
ElementType Stack::top() const
{
assert(!empty());
return first->data;
}
bool Stack::empty() const
{
return first==NULL;
}
これは単にスタックに使用しているものです
私の 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;
}
私のsudoku.ccは、目標を達成する方法について一般的なアイデアしか持っていないため、現在ほとんど空白です。空のスペースを埋める方法は、単一の領域を取り、現在の行/列に可能な限り小さい数を入れ、その行/列にそれよりも大きい数がある場合は行くことです+1アップ。次に、列などを下ります。
私の質問は、次の sudokuboard.cc と stack.cc のプログラムを自分の sudoku.cc にどのように統合するかです。何らかの方法で test.txt の入力を取得し、各行を空のボードに変換する必要があることは知っていますが、そのための cin 入力を表現する方法がまったくわかりません!
言い換えれば、sudok.cc を開始するための助けを探しています。どのようにアプローチすればよいですか?
数独.cc
#include <iostream>
#include <cassert>
#include "sudokuboard.h"
#include "stack.h"
int main()
{
}
これらの回答をくれたことに感謝したいと思います。皆さんのおかげで、私の研究室は順調に進んでいます! 私の担当者が低すぎるため、あなたにポイントを与えることはできませんが、そうでなければ私はします!