【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. ...
随机推荐
- koa源码分析
最近项目要使用koa,所以提前学习一下,顺便看了koa框架的源码. 注:源码是koa2.x koa的源码很简洁,关键代码只有4个文件,当然还包括一些依赖npm包 const Koa = require ...
- Java集合框架—List
Collection |--List:元素是有序的,元素可以重复.因为该集合体系有索引. |--ArrayList:底层的数据结构使用的是数组结构.特点:查询速度很快.但是增删稍慢.线程不同步. |- ...
- FRM-92050错误
使用IE8在打开EBS Form界面时,窗口提示信息“Internet Explorer 已对此页面进行了修改,以帮助阻止跨站脚本.单击此处,获取详细信息...”或者R12 IE8中出"FR ...
- JAXB介绍一
参考博客: https://www.cnblogs.com/chenbenbuyi/p/8283657.html https://www.cnblogs.com/cnsdhzzl/p/8390514. ...
- grafana快速入门
入门 本指南将帮助您开始并熟悉Grafana.它假定您有一台正在运行的Grafana服务器,并至少添加了一个数据源. 初学者指南 观看10分钟的初学者指南,以建立仪表板,以快速介绍设置仪表板和面板. ...
- 百倍性能的PL/SQL优化案例(r11笔记第13天)
我相信你是被百倍性能的字样吸引了,不过我所想侧重的是优化的思路,这个比优化技巧更重要,而结果嘛,其实我不希望说成是百倍提升,“”自黑“”一下. 有一个真实想法和大家讨论一下,就是一个SQL语句如果原本 ...
- Yii2 Working with Relational Data at ActiveDataProvider
Yii2 Working with Relational Data at ActiveDataProvider namespace common\models; use Yii; use yii\ba ...
- LeetCode Merge Sorted Array 合并已排序的数组
void merge(int A[], int m, int B[], int n) { int *a=A,*b=B; ,j=; ||m==){ //针对特殊情况,比如A或B中无元素的情况 & ...
- 【洛谷3157】[CQOI2011] 动态逆序对(CDQ分治)
点此看题面 大致题意: 给你一个从\(1\)到\(n\)的排列,问你每次删去一个元素后剩余的逆序对个数. 关于\(80\)分的树套树 为了练树套树,我找到了这道题目. 但悲剧的是,我的 线段树套\(T ...
- linux 查看帐号创建时间
查看用户的home目录的创建时间 查看日志 用stat 命令,可以看到目录的三个时间.不过这个时间只是用来参考的,确定一个范围. 查看日志是最准确的方法 /var/log/auth.log ,前提是你 ...