这是我关于stackoverflow的第一篇文章,所以希望我发布的内容符合此论坛网站上的正确指南/格式。
我是C ++的新手所以请耐心等待。我正在尝试用C ++实现一个数独求解器,我的目标之一是将一个数字难题( 9x9 grid )读入一个对象数组中,具体来说二维数组,然后将其内容显示在命令窗口。
给出的数独谜题采用以下格式:
0 3 0 0 0 1 0 7 0
6 0 0 8 0 0 0 0 2
0 0 1 0 4 0 5 0 0
0 7 0 0 0 2 0 4 0
2 0 0 0 9 0 0 0 6
0 4 0 3 0 0 0 1 0
0 0 5 0 3 0 4 0 0
1 0 0 0 0 6 0 0 5
0 2 0 1 0 0 0 3 0
我的头文件( sudoku_header.h )中包含的内容如下:
#pragma once
#ifndef SUDOKU_HEADER
#define SUDOKU_HEADER
#include <vector>
using namespace std;
class Cell
{
public:
friend istream& operator >>(istream &input, Cell& cellObject);
friend ostream& operator <<(ostream &output, Cell& cellObject);
bool ValueGiven();
void AssignCell(int num); // assigns a number to a cell on the puzzle board
void PopulateRows();
private:
int row, column, block; // triple context i.e. row, column and block
vector<int> candidateList; // holds a vector of all the possible candidates for a given cell
};
istream& operator >>(istream& input, Cell& cellObject)
{
input >> cellObject.row;
input >> cellObject.column;
return input;
}
ostream& operator <<(ostream& output, Cell& cellObject)
{
output << cellObject;
return output;
}
#endif
这是我的main.cpp文件中的内容:
#include <iostream>
#include <fstream>
#include <ostream>
#include <istream>
#include "sudoku_header.h"
void PopulateRows(string filename)
{
Cell **cellObject;
const int row = 9;
const int column = 9;
cellObject = new Cell*[9];
for (int i = 0; i < 9; ++i)
{
cellObject[i] = new Cell[9];
for (int j = 0; j < 9; ++j)
{
cout << &cellObject[i][j] << endl;
}
}
}
int main()
{
PopulateRows("sudoku_puzzle.txt");
cout << "\n\nPlease enter a key to exit..." << endl;
cin.get();
return 0;
}
现在上面的代码将编译并运行,并将显示每个cellObjects的内存地址,但我希望能够读入名为“sudoku_puzzle.txt”的数独谜题,然后将其内容显示在 9x9网格时尚。
任何人都可以指出我正确的方向,甚至可以告诉我怎么做?
答案 0 :(得分:2)
首先,由于输入是面向行的,我使用std::getline
对于每一行。之后的传统方法是
使用std::istringstream
来解析行中的值,但是
对于这个简单的事情(每个数字都有一个固定的
它的位置和实际值只有一个数字
可能就像直接从中提取值一样简单
字符串:character - '0'
表示相应的字符。 (输出
类似:cellValue +'0',在其中插入额外的空格
必要的。)
我也放弃了Cell
课程,只需使用。{
整个网格std::vector<int> grid(81);
。这可能是
更容易将所有相关信息保存在Grid
中
类。这取决于,两种解决方案都是可行的。但
我当然不会保留row
,column
和block
Cell
,因为它们不是细胞的特征,但是
而不是它放在网格中的位置。我不会留下来
在单元格中candidateList
:在任何给定的时刻,
cell只有一个值,而候选列表只是
与您当前正在查看的单元格相关,并且是
最好作为局部变量实现。
答案 1 :(得分:0)
结果:
. 3 . | . . 1 | . 7 .
| |
6 . . | 8 . . | . . 2
| |
. . 1 | . 4 . | 5 . .
| |
--------- ----------- ---------
| |
. 7 . | . . 2 | . 4 .
| |
2 . . | . 9 . | . . 6
| |
. 4 . | 3 . . | . 1 .
| |
--------- ----------- ---------
| |
. . 5 | . 3 . | 4 . .
| |
1 . . | . . 6 | . . 5
| |
. 2 . | 1 . . | . 3 .
代码..打印算法来自我自己的数独求解器..
#include <vector>
#include <iostream>
#include <fstream>
class Puzzle
{
private:
unsigned short Cells[9][9];
char BlankChar;
public:
Puzzle(const char* FilePath, char BlankChar = '.');
friend std::ostream& operator << (std::ostream& os, const Puzzle& p);
};
Puzzle::Puzzle(const char* FilePath, char BlankChar) : Cells(), BlankChar(BlankChar)
{
std::fstream fs(FilePath, std::ios::in);
if (fs.is_open())
{
for (int i = 0; i < 9; ++i)
{
for (int j = 0; j < 9; ++j)
{
fs >> Cells[j][i];
}
}
fs.close();
}
}
std::ostream& operator << (std::ostream &os, const Puzzle &p)
{
for (int I = 0; I < 9; ++I)
{
for (int J = 0; J < 9; ++J)
{
if (J == 3 || J == 6)
{
os << "| ";
}
if (p.Cells[J][I] == 0)
os << p.BlankChar << " ";
else
os << p.Cells[J][I] << " ";
}
os << "\n";
if (I != 8)
{
os << "\t |\t |\n";
}
if (I == 2 || I == 5)
{
os << "--------- ----------- ---------";
os << "\n";
os << "\t |\t |\n";
}
}
return os;
}
int main()
{
std::cout << Puzzle("sudoku_puzzle.txt");
}