-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathisValidSudoku.cpp
More file actions
123 lines (118 loc) · 3.68 KB
/
isValidSudoku.cpp
File metadata and controls
123 lines (118 loc) · 3.68 KB
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#include <vector>
using namespace std;
class Solution
{
public:
//遍历行
bool row(vector<vector<char>> &board)
{
//用来记录元素的数组
vector<char> temp;
//一层循环---代表第几行
for(int i = 0;i < 9;i++)
{
//二层循环,代表一行内的那个数组的第几个元素
for(int j = 0;j < 9;j++)
{
if(board[i][j] != '.')
{
//循环遍历记录元素的数组
for(int k = 0;k < temp.size();k++)
{
//发现重复,不是有效数独
if (board[i][j] == temp[k])
{
return false;
}
}
// 没发现,放入记录数组
temp.push_back(board[i][j]);
}
}
//退出循环后,清空数组,用于第二行记录
temp.clear();
}
//经过遍历,任何一行都没有发现一样的元素,因此它过关
return true;
}
//遍历列
bool column(vector<vector<char>> &board)
{
//实现思路:依旧是双重循环 + 临时数组
vector<char> temp;
//外层,代表第几列
for(int i = 0;i < 9;i++)
{
//内层:代表这一列第几个元素
for(int j = 0;j < 9;j++)
{
//检查是否为.
if(board[j][i] != '.')
{
//看是否重复
for(int k = 0;k < temp.size();k++)
{
if (board[j][i] == temp[k])
{
return false;
}
}
temp.push_back(board[j][i]);
}
}
//清空
temp.clear();
}
//没找到,过关
return true;
}
//每一个九宫格
bool grid(vector<vector<char>> &board)
{
// 第几行/列
int aGridRowMax = 0;
int aGridColumnMax = 0;
//记录数组
vector<char> temp;
//外层循环:第几个九宫格
for(int i = 1;i <= 9;i++)
{
//外层行内层列
//根据特定条件,我们要对Column和Row进行 + 3操作
aGridRowMax = ((i - 1) % 3 + 1) * 3;
aGridColumnMax = ((i - 1) / 3 + 1) * 3;
for (int j = aGridColumnMax - 3; j < aGridColumnMax; j++)
{
for (int k = aGridRowMax - 3; k < aGridRowMax; k++)
{
if(board[j][k] != '.')
{
for(int l = 0;l < temp.size();l++)
{
if(board[j][k] == temp[l])
{
return false;
}
}
temp.push_back(board[j][k]);
}
}
}
//遍历完每一个九宫格,清空该数组
temp.clear();
}
//没找到,满足
return true;
}
bool isValidSudoku(vector<vector<char>> &board)
{
// 先行,后列,再九宫格,遍历,每个循环用数组进行记录是否有相同的
if (row(board) && column(board) && grid(board))
{
//全部成立,是有效的九宫格
return true;
}
//可能某一个不成立,不是有效的数独
return false;
}
};