【Valid Sudoku】cpp
题目:
Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules.
The Sudoku board could be partially filled, where empty cells are filled with the character '.'.
![]()
A partially filled sudoku which is valid.
Note:
A valid Sudoku board (partially filled) is not necessarily solvable. Only the filled cells need to be validated.
代码:
class Solution {
public:
bool isValidSudoku(std::vector<std::vector<char> > &board)
{
int len = board.size();
if (len != ) return false;
bool row_check[];
bool col_check[];
bool subBox_check[];
for (int row = ; row < len; ++row)
{
std::fill(row_check, row_check+, false);
std::fill(col_check, col_check+, false);
std::fill(subBox_check, subBox_check+, false);
for (int col = ; col < len; ++col)
{
if (!Solution::if_valid(board, row, col, row_check)){
return false;
}
if (!Solution::if_valid(board, col, row, col_check)){
return false;
}
if (!Solution::if_valid(board, *(row/)+col/, *(row%)+col%, subBox_check)){
return false;
}
}
}
return true;
}
static bool if_valid(std::vector<std::vector<char> > &board, int x, int y, bool (&some_check)[])
{
if (board[x][y]=='.'){
return true;
}
else{
if (some_check[board[x][y]-'']){
return false;
}
else{
some_check[board[x][y]-''] = true;
return true;
}
}
return false;
}
};
Tips:
1. 整体逻辑按照数独的要求走:
a. 判断同一行
b. 判断同一列
c. 判断所在的sub box
2. 判断时主要利用的数据结构是类似HashSet,由于三类判断条件类似,因此单独提出来一段代码。
3. 一点儿技巧:这里时间复杂度没有什么可说的就是O(n²);可以做些文章的地方就是代码复杂度,如何遍历一次for..for...就判断完成全部的逻辑。
a. 这里的核心就在于数独是对称的矩阵,行列对称;因此,行列坐标互换就可以走一次for...for...就完成1.a和1.b的判断逻辑。
b. 这里还需要注意的是,for..for..中走完一列,则需要判断一个sub box是否valid;因此,需要将某一列的坐标映射到某个sub box上。搞清楚这一点就可以推理处坐标变换的公式。
4. 在离线测试的时候,处理c++的 vector 二维字符数组还是非常不熟练,由Python转成cpp刷题确实不太习惯。后面在刷到string的题目时候,再把这cpp这部分强化一下。
==================================================
第二次过这道题,第一次没有AC还是错在了sub matrix小方块的检验上面。
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
for ( int i=; i<board.size(); ++i )
{
// check row
vector<bool> row_used(,false);
for ( int j=; j<board[i].size(); ++j )
{
if ( board[i][j]!='.' )
{
if ( row_used[board[i][j]-''] ) return false;
row_used[board[i][j]-''] = true;
}
}
// check col
vector<bool> col_used(,false);
for ( int j=; j<board.size(); ++j)
{
if ( board[j][i]!='.')
{
if ( col_used[board[j][i]-''] ) return false;
col_used[board[j][i]-''] = true;
}
}
// check sub matrix
vector<bool> subm_used(,false);
for ( int j=; j<board[i].size(); ++j )
{
int row = *(i/) + j/;
int col = *(i%) + j%;
if ( board[row][col]!='.' )
{
if ( subm_used[board[row][col]-''] ) return false;
subm_used[board[row][col]-''] = true;
}
}
}
return true;
}
};
tips:
这个要记住了
row = 3*(i/3) + j/3
col = 3*(i%3) + j%3
【Valid Sudoku】cpp的更多相关文章
- 【Valid Palindrome】cpp
题目: Given a string, determine if it is a palindrome, considering only alphanumeric characters and ig ...
- 【Valid Parentheses】cpp
题目: Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the ...
- 【Valid Number】cpp
题目: Validate if a given string is numeric. Some examples:"0" => true" 0.1 " = ...
- 【Longest Valid Parentheses】cpp
题目: Given a string containing just the characters '(' and ')', find the length of the longest valid ...
- hdu 4739【位运算】.cpp
题意: 给出n个地雷所在位置,正好能够组成正方形的地雷就可以拿走..为了简化题目,只考虑平行于横轴的正方形.. 问最多可以拿走多少个正方形.. 思路: 先找出可以组成正方形的地雷组合cnt个.. 然后 ...
- Hdu 4734 【数位DP】.cpp
题意: 我们定义十进制数x的权值为f(x) = a(n)*2^(n-1)+a(n-1)*2(n-2)+...a(2)*2+a(1)*1,a(i)表示十进制数x中第i位的数字. 题目给出a,b,求出0~ ...
- 【Gray Code】cpp
题目: The gray code is a binary numeral system where two successive values differ in only one bit. Giv ...
- 【Permutations II】cpp
题目: Given a collection of numbers that might contain duplicates, return all possible unique permutat ...
- 【Subsets II】cpp
题目: Given a collection of integers that might contain duplicates, nums, return all possible subsets. ...
随机推荐
- Android ImageView的几种对图片的缩放处理 解决imageview放大图片后失真问题解决办法
我的解决办法: 1 首先设置android:layout_width=”wrap_content”和android:layout_height=”wrap_content”,否则你按比例缩放后的图片放 ...
- JS案例练习 — 给div添加样式选择功能
附加效果图: CSS内容: <style> ; padding:0px} li{list-style:none} body{font:24px 'Microsoft YaHei'; col ...
- MySQL-5.6.30 (OpenLogic CentOS7.2)
平台: CentOS 类型: 虚拟机镜像 软件包: centos7.2 mysql5.6.30 basic software database linux open source 服务优惠价: 按服务 ...
- pat甲级1139
1139 First Contact(30 分) Unlike in nowadays, the way that boys and girls expressing their feelings o ...
- selective search生成.mat文件
https://github.com/sergeyk/selective_search_ijcv_with_python 里的selective_search.py是python接口 import t ...
- python模块;opencv安装
http://www.lfd.uci.edu/~gohlke/pythonlibs/ 1. 步骤1. 下载Python2.73, 安装, 并配置Python环境变量:".\Program F ...
- Jquery中的CheckBox、RadioButton、DropDownList的取值赋值实现代码
随着Jquery的作用越来越大,使用的朋友也越来越多.在Web中,由于CheckBox. Radiobutton . DropDownList等控件使用的频率比较高,就关系到这些控件在Jquery中的 ...
- 问题003:JDK文件夹下的bin有什么作用?javac.exe和java.exe双击后为什么一闪而过,没了?
bin (binary)二进制 ,JDK当中所有的可以执行的二进制应用程序都放在其中.其中都是*.exe文件,表示可以直接执行程序. javac.exe和java.exe双击后为什么一闪而过,没了?因 ...
- oc block排序
NSArray *sortArr=[arr sortedArrayUsingSelector:@selector(compareWithClassAndName:)]; //数组排序--block N ...
- 解决: Intelij IDEA 创建WEB项目时没有Servlet的jar包
今天创建SpringMVC项目时 用到HttpServletRequest时, 发现项目中根本没有Servlet这个包, 在网上搜了一下,这个问题是因为web项目没有添加服务器导致的. 配置tomec ...