2016-08-27 12 views
0

Во-первых, я начинающий кодер, и я пытался часами решить и решить часть своей проблемы и не могу понять это.Файл ввода-вывода (Sudoku Solver)

Я выполнил всю задачу, за исключением двух задач: 1.) Я не могу понять, как использовать механизм ввода и outfile ifstream и ofstream, чтобы получить мой .txt-файл для установки моих значений для моей платы sudoku. 2.) Кажется, я не могу понять, как распечатать доску sudoku для каждого «возможных значений» для каждой xyposition в ячейках.

Я пытаюсь реализовать текстовый файл, который гласит:

puzzle.setBoardValue(0,0,1); 
    puzzle.setBoardValue(1,1,3); 
    puzzle.setBoardValue(2,2,9); 

    puzzle.setBoardValue(3,2,6); 
    puzzle.setBoardValue(4,1,2); 
    puzzle.setBoardValue(5,0,7); 

    puzzle.setBoardValue(6,2,5); 
    puzzle.setBoardValue(7,0,9); 
    puzzle.setBoardValue(8,1,8); 

    puzzle.setBoardValue(0,5,6); 
    puzzle.setBoardValue(1,4,1); 
    puzzle.setBoardValue(2,3,5); 

    puzzle.setBoardValue(3,3,3); 
    puzzle.setBoardValue(4,4,8); 
    puzzle.setBoardValue(5,5,4); 

    puzzle.setBoardValue(6,3,9); 
    puzzle.setBoardValue(8,4,2); 

    puzzle.setBoardValue(0,6,3); 
    puzzle.setBoardValue(1,7,4); 
    puzzle.setBoardValue(2,8,7); 

    puzzle.setBoardValue(6,8,3); 
    puzzle.setBoardValue(7,6,1); 
    puzzle.setBoardValue(8,7,7); ` 

и в основном использовать, чтобы автоматически направление моей программы для функции void setBoardValue(); Все, что я понял, был в моем int main(); где я поставил

cout << "Enter filename:" << endl; 
cin >> filename; 
in.open(filename); 
while(getline(in,line)){ 
... 

Во-вторых, я просто не могу понять, как печатать все возможные значения для каждой числовой ячейки.

Вот вся моя программа Код:

#include <iostream> 
#include <fstream> 
#include <vector> 

using namespace std; 

class SudokuPuzzle{ 

private: 
    unsigned short board[9][9]; 
    char BlankChar; 
    bool debug; 
    void printTracerTryingValue(int xpos, int ypos); 
    bool solve(int xpos, int ypos); 
    bool verifyValue(int xpos, int ypos); 

public: 
    SudokuPuzzle(); 
    void print(); 
    void setBoardValue(int xpos, int ypos, int value); 
    int getBoardValue(int xpos, int ypos); 
    bool solve(); 
}; 

SudokuPuzzle::SudokuPuzzle(){ 
    debug = false; 
    for (int i = 0; i < 9; ++i){ 
    for (int j = 0; j < 9; ++j){ 
     board[j][i] = 0; 
    } 
    } 
} 

void SudokuPuzzle::print(){ 
    for (int y = 0; y < 9; y++){ 
    if (y % 3 == 0){ 
     cout << "-------------------------------" << endl; 
    } 
    for (int x = 0; x < 9; x++){ 
     if (x % 3 == 0){ 
     cout << "|"; 
     } 
     if (board[x][y] != 0){ 
     cout << " " << board[x][y] << " "; 
     } 
     else{ 
     cout << " . "; 
     } 
    } 
    cout << "|" << endl; 
    } 
    cout << "-------------------------------" << endl; 
} 

void SudokuPuzzle::setBoardValue(int xpos, int ypos, int value){ 
    board[xpos][ypos] = value; 
} 

void SudokuPuzzle::setBoardValue(int xpos, int ypos, int value){ 
    board[xpos][ypos] = value; 
} 

bool SudokuPuzzle::solve(){ 
    return solve(0,0); 
} 

void SudokuPuzzle::setBoardValue(int xpos, int ypos, int value){ 
    board[xpos][ypos] = value; 
} 

bool SudokuPuzzle::solve(){ 
    return solve(0,0); 
} 

int SudokuPuzzle::getBoardValue(int xpos, int ypos){ 
    return board[xpos][ypos]; 
} 

bool SudokuPuzzle::solve(int xpos, int ypos){ 
    if (board[xpos][ypos] != 0){ 
    if (verifyValue(xpos, ypos)){ 
     if (xpos == 8 && ypos == 8){ 
     return true; 
     } 
     int next_x = xpos+1; 
     int next_y = ypos; 
     if (next_x >= 9){ 
     next_x = 0; 
     next_y++; 
     } 
     return solve(next_x, next_y); 
    } 
    else{ 
     return false; 
    } 
    } 
    for(int value = 1; value < 10; value++){ 
    setBoardValue(xpos, ypos, value); 
    if (verifyValue(xpos, ypos)){ 
     if (xpos == 8 && ypos == 8){ 
     return true; 
     } 
     int next_x = xpos+1; 
     int next_y = ypos; 

     if (next_x >= 9){ 
     next_x = 0; 
     next_y++; 
     } 
     if (solve(next_x, next_y)){ 
     return true; 
     } 
    } 
    } 

    board[xpos][ypos] = 0; 
    return false; 
} 
bool SudokuPuzzle::verifyValue(int xpos, int ypos){ 
    printTracerTryingValue(xpos, ypos); 
    int value = board[xpos][ypos]; 
    for (int x_verify = 0; x_verify < 9; x_verify++){ 
    if (x_verify == xpos){ 
     continue; 
    } 
    int verifyValue = board[x_verify][ypos]; 
    if (verifyValue == value){ 
     return false; 
    } 
    } 
    for (int y_verify = 0; y_verify < 9; y_verify++){ 
    if (y_verify == ypos){ 
     continue; 
    } 
    int verifyValue = board[xpos][y_verify]; 
    if (verifyValue == value){ 
     return false; 
    } 
    } 

    int box_x = xpos/3; 
    int box_y = ypos/3; 

    for (int y_verify = box_y * 3; y_verify < box_y * 3 + 3; y_verify++){ 
    for (int x_verify = box_x * 3; x_verify < box_x * 3 + 3; x_verify++){ 
     if (x_verify == xpos && y_verify == ypos){ 
     continue; 
     } 

     int verifyValue = board[x_verify][y_verify]; 
     if (verifyValue == value){ 
     return false; 
     } 
    } 
    } 
    return true; 
} 

void SudokuPuzzle::printTracerTryingValue(int xpos, int ypos){ 
    if(debug){ 
    for (int i = 0; i < xpos+ypos; i++){ 
     cout << " "; 
    } 
    cout << "Trying value " << board[xpos][ypos] << " at board[" << xpos << "][" \ 
<< ypos <<"]" << endl; 
    } 
} 

int main(int argc, char *const argv[]){ 
    SudokuPuzzle puzzle; 
    string filename; 
    string line; 
    ifstream in; 
    ofstream out; 

    cout << "Enter filename:" << endl; 
    cin >> filename; 
    in.open(filename); 
    while(getline(in, line)){ 
    puzzle.line.print() 
    } 
    cout << endl; 

    if(puzzle.solve()){ 
    cout << "Solution:" << endl; 
    puzzle.print(); 
    } 
    else{ 
    cout << "Puzzle is not solvable."; 
    } 
    cout << endl; 
    return 0; 
} 
+0

Вы сказали, что у вас возникли проблемы с использованием потоков для чтения файла.Можете ли вы показать нам свою попытку и что произошло, когда вы попробовали? – Chris

+0

Я попытался реализовать часть, поэтому я могу прочитать каждую строку в .txt –

+0

Я не компилировал и не запускал ее, потому что у меня возникли проблемы с использованием каждой строки для использования puzzle.print(). –

ответ

1

Ваш вопрос написан немного смутно, но я постараюсь ответить на него, как я понял. Во-первых, я надеюсь, что у вас нет фактических вызовов функций в вашем текстовом файле - нет способа вызвать функцию непосредственно из этого текстового файла. Кроме того, в вашем заявлении while в main() звонок по телефону puzzle.line.print() не имеет смысла, потому что print() не является методом std::string, а ваша 'линия' не является членом типа SudokuPuzzle.

Так что, если вы просто заинтересованы в хранении и чтения позиции на сетке, где вы ожидаете вход регулярным, вы можете иметь файл, который просто выглядит следующим образом:

0 0 1 
1 1 3 
2 2 9 
...(etc) 

От там, не обращая внимания на вход или проверки ошибок, мы могли бы иметь некоторый код, как это, чтобы читать из файла:

std::ifstream readFile("Text.txt"); //construct ifstream object from text file 
std::vector<int> vec; 
int file_input; //temporary variable to hold input 
while(readFile >> file_input) 
{ 
    vec.push_back(file_input); 
}; 
readFile.close(); 

работает с потокового видео просто, как работать с std::cin или std::cout; Вы используете операторы потока << и >> для переноса информации между потоками и другими данными.

Теперь мы можем сделать любую обработку, необходимую нам для структуры данных (в данном случае std::vector, но это может быть что угодно).

Когда нам нужно записать его обратно, мы можем использовать этот вид кода:

std::ofstream writeFile("Text.txt"); //overwrites contents! 
for(unsigned i = 0; i < vec.size(); ++i) 
{ 
    //this is just to format the text output to the same way it came in 
    writeFile << vec[i] << ' '; 
    if ((i + 1) % 3 == 0) 
    writeFile << '\n'; 
} 
writeFile.close(); 

В блоке кода, где вы форматировать текст для вывода, где вы можете сделать что-то подобное с помощью символов например | и _, чтобы создать сетку. У вас должно быть какое-то представление о том, как это сделать (подумайте, куда их нужно вставить, они должны появиться в предсказуемых местах).

Here's some example code as well.