【题目】
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.
【题意】
假设一个数独是有效的,则它符合数独游戏 规则(点击打开链接)。
数独游戏 规则:
(1)每一行都必须在1-9的范围内,且只出现一次。
(2)每一列都必须在1-9的范围内,且只出现一次。
(3)数字1-9在每个子宫格中只出现一次。
数独宫格可以部分填充,其中空单元格都充满了字符'.'。
例如:
部分填充的有效数独
【分析】
细节分析题
(1)检查行
(2)检查列
(3)检查9个子宫格
【代码】
/*********************************
* 日期:2014-01-20
* 作者:SJF0115
* 题号: Valid Sudoku
* 来源:http://oj.leetcode.com/problems/valid-sudoku/
* 结果:AC
* 来源:LeetCode
* 总结:
**********************************/
#include <iostream>
#include <stdio.h>
#include <vector>
#include <string.h>
#include <algorithm>
using namespace std;
class Solution {
public:
bool isValidSudoku(vector<vector<char> > &board) {
int i,j,k;
//判断1-9是否已用
bool used[9];
for(i = 0;i < 9;i++){
//检查行
memset(used,false,9);
for(j = 0;j < 9;j++){
//不符合规则
if(!check(board[i][j],used)){
return false;
}//if
}//for
//检查列
memset(used,false,9);
for(j = 0;j < 9;j++){
//不符合规则
if(!check(board[j][i],used)){
return false;
}//if
}//for
}//for
//检查9个子宫格
for(k = 0;k < 3;k++){
memset(used,false,9);
for(i = k*3;i < 3*k + 3;i++){
for(j = 0;j < 3;j++){
//不符合规则
if(!check(board[i][j],used)){
return false;
}//if
}//for
}//for
memset(used,false,9);
for(i = k*3;i < 3*k + 3;i++){
for(j = 3;j < 6;j++){
//不符合规则
if(!check(board[i][j],used)){
return false;
}//if
}//for
}//for
memset(used,false,9);
for(i = k*3;i < 3*k + 3;i++){
for(j = 6;j < 9;j++){
//不符合规则
if(!check(board[i][j],used)){
return false;
}//if
}//for
}//for
}//for
return true;
}
private:
bool check(char c,bool used[9]){
if(c == '.'){
return true;
}
//字符c 已用
if(used[c - '1']){
return false;
}
//字符c 未用
else{
used[c - '1'] = true;
return true;
}
}
};
int main() {
Solution solution;
bool result;
vector<vector<char>> board;
char value[9] = {'5','3','.','.','7','.','.','.','.'};
vector<char> subBoard(value,value + 9);
board.push_back(subBoard);
value = {'6','.','.','1','9','5','.','.','.'};
vector<char> subBoard1(value,value + 9);
board.push_back(subBoard1);
value = {'.','9','8','.','.','.','.','6','.'};
vector<char> subBoard2(value,value + 9);
board.push_back(subBoard2);
value = {'8','.','.','.','6','.','.','.','3'};
vector<char> subBoard3(value,value + 9);
board.push_back(subBoard3);
value = {'4','.','.','8','.','3','.','.','1'};
vector<char> subBoard4(value,value + 9);
board.push_back(subBoard4);
value = {'7','.','.','.','2','.','.','.','6'};
vector<char> subBoard5(value,value + 9);
board.push_back(subBoard5);
value = {'.','6','.','.','.','.','2','8','.'};
vector<char> subBoard6(value,value + 9);
board.push_back(subBoard6);
value = {'.','.','.','4','1','9','.','.','5'};
vector<char> subBoard7(value,value + 9);
board.push_back(subBoard7);
value = {'.','.','.','.','8','.','.','7','9'};
vector<char> subBoard8(value,value + 9);
board.push_back(subBoard8);
result = solution.isValidSudoku(board);
cout<<result<<endl;
return 0;
}
【代码2】
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
bool used[9];
for (int i = 0; i < 9; ++i) {
fill(used, used + 9, false);
// 检查行
for (int j = 0; j < 9; ++j){
if (!check(board[i][j], used)){
return false;
}//if
}//for
fill(used, used + 9, false);
// 检查列
for (int j = 0; j < 9; ++j) {
if (!check(board[j][i], used)){
return false;
}//if
}//for
}//for
// 检查 9 个子格子
for (int r = 0; r < 3; ++r) {
for (int c = 0; c < 3; ++c) {
fill(used, used + 9, false);
for (int i = r * 3; i < r * 3 + 3; ++i){
for (int j = c * 3; j < c * 3 + 3; ++j){
if (!check(board[i][j], used)){
return false;
}
}//for
}//for
}//for
}//for
return true;
}
bool check(char ch, bool used[9]) {
if (ch == '.') return true;
if (used[ch - '1']) return false;
used[ch - '1'] = true;
return true;
}
};
分享到:
相关推荐
LeetCode Valid Parenthese解决方案
sudoku example 做leetcode37的时候看到的解数独的非常棒的方法。在简单回溯的基础上还加上了限制条件,会更快。主要参考 . 自己在main里面加上了一点从txt里读写,这样可以自己敲进去题目然后得到答案,比只是...
leetcode 答案 Sudoku ref: UserInterface IUserInterfaceContract:前端与后端的交互接口 EventListener:处理每次输入时的接口 View:更新前端以及消息提示的接口 SudokuTextField:继承了JavaFX中的TextField接口...
leetcode最难LeetCode_ValidNumber 因为我疯了,所以我去了 LeetCode,并按 Hardest:LeastSolved 排序。 没有汗! 语言:C# 我学到的是 这个很疯狂,因为它在定义实际可以算作数字方面确实做得很差。 如果这是面对面...
刷LeetCode刷LeetCode刷LeetCode刷LeetCode刷LeetCode
Valid Palindrome LeetCode 167 Two Sum II - Input array is sorted LeetCode 344 Reverse String LeetCode 345 Reverse Vowels of a String 2 字符串 编号 题目 LeetCode 3 Longest Substring Without Repeating ...
大佬的leetcode刷题笔记(c++版本)
vs code LeetCode 插件
LeetCode 101_C++_算法_leetcode_leetcode101_leetcode101.zip
leetcode中文版
LeetCode 101_C++_算法_leetcode_leetcode101_leetcode101_源码.zip
leetcode刷题之动态规划
100个leetCode详细解答
LeetCode 刷题汇总1
LeetCode 选讲1
terminal-leetcode, 终端Leetcode是基于终端的Leetcode网站查看器 终端 leetcode终端leetcode是基于终端的leetcode网站查看器。本项目是由 RTV 激发的。 我最近正在学习本地化的反应,以实践我的新知识,并根据这个...
leetcode刷题, 直接用leetcode的分类方式.
该分类为结合《算法导论》的内容,给出Leetcode题目分类。题目主要集中在Leetcode的前400题中,也包括有后面的一些经典值得刷的题。该题目分类按照算法和数据结构排版,即可供单独Leetcode刷题使用,也可以配合学习...
这份文档列出了leetcode几乎所有题目(大约134题)的分类以及难度指示,是刷leetcode的必备良品。现在leetcode总的题目数已经达到150题,所以有部分题目没有包含在这个文档中,但是——足够了。po主刷leetcode的时候...
leetcode高频面试笔试题150+道,亲身总结。