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 ‘.’
这道题就是判断目前的数独表格是否是合理的,需要判断每一行、每一列和每一个子矩形,判断的思路就是查看是否有重复元素,思路很简单,就是有点麻烦。
代码如下:
import java.util.HashSet;
import java.util.Set;
public class Solution
{
//这个很简单就是确认一下这个数独是否矛盾
//就是确认每一行,每一列,每一个子方宫格是否矛盾
//是否矛盾的标准就是是否有重复元素
public boolean isValidSudoku(char[][] board)
{
if(board==null)
return true;
//检查每一行
for(int i=0;i<board.length;i++)
{
if(isVaild(board,i,0)==false)
return false;
}
//检查每一列
for(int i=0;i<board[0].length;i++)
{
if(isVaild(board,i,1)==false)
return false;
}
//检查每一个子宫格
for(int i=0;i<9;i+=3)
{
for(int j=0;j<9;j+=3)
{
int rowS=i,rowE=i+3;
int colS=j,colE=j+3;
if(isVaildFor(board,rowS,rowE,colS,colE)==false)
return false;
}
}
return true;
}
//这个是见检查每一个子宫格的矛盾与否
private boolean isVaildFor(char[][] board, int rowS, int rowE, int colS,int colE)
{
Set<Character> mySet=new HashSet<>();
for(int i=rowS;i<rowE;i++)
{
for(int j=colS;j<colE;j++)
{
if(board[i][j]!='.')
{
if( mySet.contains(board[i][j]))
return false;
else
mySet.add(board[i][j]);
}
}
}
return true;
}
//这个是见检查每一行或者列的矛盾与否
private boolean isVaild(char[][] board, int index, int flag)
{
Set<Character> mySet=new HashSet<>();
//flag为0表示每一行
if(flag==0)
{
for(int i=0;i<9;i++)
{
if(board[index][i]!= '.')
{
if( mySet.contains(board[index][i]))
return false;
else
mySet.add(board[index][i]);
}
}
}else if(flag==1) //flag为1表示每一列
{
for(int i=0;i<9;i++)
{
if(board[i][index]!='.')
{
if(mySet.contains(board[i][index]))
return false;
else
mySet.add(board[i][index]);
}
}
}
return true;
}
}
下面是C++的做法,直接暴力即可
代码如下:
#include <iostream>
#include <vector>
#include <set>
using namespace std;
class Solution
{
public:
bool isValidSudoku(vector<vector<char>>& board)
{
for (int i = 0; i < board.size(); i++)
{
if (isVaild(board, i, true) == false)
return false;
}
for (int i = 0; i < board[0].size(); i++)
{
if (isVaild(board, i, false) == false)
return false;
}
for (int i = 0; i < board.size(); i+=3)
{
for (int j = 0; j < board[0].size(); j+=3)
{
if (isVaildSub(board, i, j) == false)
return false;
}
}
return true;
}
bool isVaild(vector<vector<char>> board, int n, bool isRow)
{
set<char> s;
if (isRow)
{
for (int i = 0; i < board[0].size(); i++)
{
char key = board[n][i];
if (key != '.')
{
if (s.find(key) != s.end())
return false;
else
s.insert(key);
}
}
return true;
}
else
{
for (int i = 0; i < board.size(); i++)
{
char key = board[i][n];
if (key != '.')
{
if (s.find(key) != s.end())
return false;
else
s.insert(key);
}
}
return true;
}
}
bool isVaildSub(vector<vector<char>> board, int a, int b)
{
set<char> s;
for (int i = a; i < a + 3; i++)
{
for (int j = b; j < b + 3; j++)
{
char key = board[i][j];
if (key != '.')
{
if (s.find(key) != s.end())
return false;
else
s.insert(key);
}
}
}
return true;
}
};