Sudoku Solver 1.0
Загрузка...
Поиск...
Не найдено
sudoku_io.h
См. документацию.
1#pragma once
2#include <array>
3#include <fstream>
4#include <iostream>
5#include <iomanip>
6#include <string>
8
9namespace SudokuIO {
10
11 // Чтение доски из файла
12 template<size_t N>
13 bool readBoardFromFile(const std::string& filename, std::array<std::array<int, N>, N>& board) {
14 std::ifstream file(filename);
15 if (!file.is_open()) {
16 std::cerr << "Error: Cannot open file " << filename << "\n";
17 return false;
18 }
19
20 for (size_t row = 0; row < N; ++row) {
21 for (size_t col = 0; col < N; ++col) {
22 if (!(file >> board[row][col])) {
23 std::cerr << "Error: Invalid format at row " << row << ", col " << col << "\n";
24 return false;
25 }
26 }
27 }
28 return true;
29 }
30
31 // Чтение доски из stdin
32 template<size_t N>
33 bool readBoardFromStdin(std::array<std::array<int, N>, N>& board) {
34 std::cout << "Enter " << N << " rows of " << N << " numbers (0 for empty):\n";
35 for (size_t row = 0; row < N; ++row) {
36 for (size_t col = 0; col < N; ++col) {
37 if (!(std::cin >> board[row][col])) {
38 std::cerr << "Error: Invalid input at row " << row << ", col " << col << "\n";
39 return false;
40 }
41 }
42 }
43 return true;
44 }
45
46 // Вывод доски в консоль
47 template<size_t N>
48 void printBoard(const std::array<std::array<int, N>, N>& board) {
49 constexpr int block_size = static_cast<int>(constexpr_sqrt(N));
50 const int cell_width = 2; // ширина поля для одного числа
51
52 for (size_t row = 0; row < N; ++row) {
53 // Горизонтальный разделитель блоков (перед строкой блока)
54 if (row % block_size == 0 && row != 0) {
55 for (size_t i = 0; i < N; ++i) {
56 std::cout << "---";
57 if (i % block_size == block_size - 1 && i != N - 1) {
58 std::cout << "+";
59 }
60 }
61 std::cout << "\n";
62 }
63
64 for (size_t col = 0; col < N; ++col) {
65 // Вертикальный разделитель блоков
66 if (col % block_size == 0 && col != 0) {
67 std::cout << "|";
68 }
69
70 int val = board[row][col];
71 if (val == 0) {
72 std::cout << " .";
73 }
74 else {
75 std::cout << std::setw(cell_width) << val;
76 }
77
78 // Пробел между клетками (кроме последней)
79 if (col < N - 1) std::cout << " ";
80 }
81 std::cout << "\n";
82 }
83 }
84
85 // Запись доски в файл
86 template<size_t N>
87 bool writeBoardToFile(const std::string& filename, const std::array<std::array<int, N>, N>& board) {
88 std::ofstream file(filename);
89 if (!file.is_open()) {
90 std::cerr << "Error: Cannot open file " << filename << " for writing\n";
91 return false;
92 }
93
94 for (size_t row = 0; row < N; ++row) {
95 for (size_t col = 0; col < N; ++col) {
96 file << board[row][col];
97 if (col != N - 1) file << " ";
98 }
99 file << "\n";
100 }
101 return true;
102 }
103
104} // namespace SudokuIO
Определения sudoku_io.h:9
bool readBoardFromStdin(std::array< std::array< int, N >, N > &board)
Определения sudoku_io.h:33
bool readBoardFromFile(const std::string &filename, std::array< std::array< int, N >, N > &board)
Определения sudoku_io.h:13
void printBoard(const std::array< std::array< int, N >, N > &board)
Определения sudoku_io.h:48
bool writeBoardToFile(const std::string &filename, const std::array< std::array< int, N >, N > &board)
Определения sudoku_io.h:87
constexpr size_t constexpr_sqrt(size_t n)
Вычисление целочисленного квадратного корня на этапе компиляции
Определения sudoku_solver.h:13