-
Notifications
You must be signed in to change notification settings - Fork 0
/
day 88
104 lines (91 loc) · 2.34 KB
/
day 88
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include <string>
#include <iostream>
typedef unsigned int Board[9][9];
const unsigned int Empty = 0;
// find the first solution and store it in board
bool solve(Board& board)
{
for (unsigned int y = 0; y < 9; y++)
for (unsigned int x = 0; x < 9; x++)
{
// already solved cell ?
if (board[x][y] != Empty)
continue;
// track which numbers could be placed in the current cell
bool available[9+1] = { false, true, true, true, true, true, true, true, true, true };
// note: available[0] is a dummy entry, the program only uses available[1..9]
// same row and column
for (unsigned int i = 0; i < 9; i++)
{
if (board[i][y] != Empty)
available[board[i][y]] = false;
if (board[x][i] != Empty)
available[board[x][i]] = false;
}
// same region (3x3 area)
unsigned int rx = (x / 3) * 3;
unsigned int ry = (y / 3) * 3;
for (unsigned int i = 0; i < 3; i++)
for (unsigned int j = 0; j < 3; j++)
if (board[i + rx][j + ry] != Empty)
available[board[i + rx][j + ry]] = false;
// try all still available numbers
for (unsigned int i = 1; i <= 9; i++)
if (available[i])
{
board[x][y] = i;
if (solve(board))
return true;
}
// all failed, restore old board
board[x][y] = Empty;
return false;
}
// solved it
return true;
}
int main()
{
//#define ORIGINAL
#ifdef ORIGINAL
unsigned int tests = 50;
unsigned int sum = 0;
#else
unsigned int tests = 1;
#endif
while (tests--)
{
#ifdef ORIGINAL
// skip labels "GRID xy"
std::string dummy;
std::cin >> dummy >> dummy;
#endif
// read board
Board board;
for (unsigned int y = 0; y < 9; y++)
{
std::string line;
std::cin >> line;
for (unsigned int x = 0; x < 9; x++)
board[x][y] = line[x] - '0';
}
// and replace all zeros (=Empty) with proper digits
solve(board);
#ifdef ORIGINAL
// the first the cells
sum += 100 * board[0][0] + 10 * board[1][0] + board[2][0];
#else
// print full solution
for (unsigned int y = 0; y < 9; y++)
{
for (unsigned int x = 0; x < 9; x++)
std::cout << board[x][y];
std::cout << std::endl;
}
#endif
}
#ifdef ORIGINAL
std::cout << sum;
#endif
return 0;
}