将数独谜题读入c ++中的对象数组并显示其内容

时间:2014-04-22 15:09:50

标签: c++ arrays sudoku

这是我关于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网格时尚。

任何人都可以指出我正确的方向,甚至可以告诉我怎么做?

2 个答案:

答案 0 :(得分:2)

首先,由于输入是面向行的,我使用std::getline 对于每一行。之后的传统方法是 使用std::istringstream来解析行中的值,但是 对于这个简单的事情(每个数字都有一个固定的 它的位置和实际值只有一个数字 可能就像直接从中提取值一样简单 字符串:character - '0'表示相应的字符。 (输出 类似:cellValue +'0',在其中插入额外的空格 必要的。)

我也放弃了Cell课程,只需使用。{ 整个网格std::vector<int> grid(81);。这可能是 更容易将所有相关信息保存在Grid中 类。这取决于,两种解决方案都是可行的。但 我当然不会保留rowcolumnblock 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");
}