1 题目描述
2 选题原因
随机选了一道题,很坑。第一次做题做到生无可恋。
3 题目分析及算法
3.1 常规分析
看到这道题心情确实不美丽,本来是用
C++
写的,但是C++
尽然用了vector<vector<char> >
这样莫名其妙的结构,说白了就是不想让我用C++
呗。隔壁java
好歹还用了char[][]
呢,你就不羞愧吗?
但是我就是要用C++
写,这也导致了我的心情更加的不美丽。
先看思路:正常解数独是怎么样的?数独怎么玩可以看一下,讲的蛮好的。
但是你都有计算机了,为什么不暴力解呢?害怕浪费电吗??
思路说白了很简单,就是每一个空格一个数一个数的去试,一直试到最后一个数;当有位置尝试失败的时候,就返回上一位置,继续试。
3.2 算法概述
FOR i = 0: 9
- FOR j = 0: 9
-
- IF (M(i, j) == ‘.’)
-
-
- FOR k = ‘1’: ‘9’
-
-
-
-
- IF CHECK(M(i, j), k)
-
-
-
-
-
-
- M(i, j) = k;
-
-
-
-
-
-
-
- SLOVE(M(i, j) + 1);
-
-
-
-
-
-
- ELSE
-
-
-
-
-
-
- CONTINUE;
-
-
-
-
-
-
- END IF
-
-
-
-
-
- IF NOT FINISH
-
-
-
-
-
-
- M(i, j) = ‘.’;
-
-
-
-
-
-
- END IF
-
-
-
-
- END FOR
-
-
- END IF
- END FOR
END FOR
3.3 问题
我已不知道问题在哪里,但是!我的代码跑不了!
生无可恋,我找了一份java
代码,看着一样的思路,结果成功了,我不禁陷入沉思。
这是在搞笑吗?
?
?
4 关键代码
4.1 比较函数
private boolean isValid(char[][] board, int i, int j, char v) {
//比较一行的差别
for (int row = 0; row < 9; row++) {
if (board[row][j] == v) {
return false;
}
}
//比较一列的差别
for (int col = 0; col < 9; col++) {
if (board[i][col] == v) {
return false;
}
}
//比较一宫的差别
for (int row = i / 3 * 3; row < i / 3 * 3 + 3; row++) {
for (int col = j / 3 * 3; col < j / 3 * 3 + 3; col++) {
if (board[row][col] == v) {
return false;
}
}
}
return true;
}
4.2 解函数
private boolean searchRes(char[][] board) {
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board[0].length; j++) {
//不需要填充的空格直接跳过
if (board[i][j] != '.') {
continue;
}
//需要填充的空格慢慢补充
for (char num = '1'; num <= '9'; num++) {
//不合法则直接跳过
if (!isValid(board, i, j, num)) {
continue;
}
board[i][j] = num;
//如果能够成功
if (searchRes(board)) {
return true;
//否则回退
} else {
board[i][j] = '.';
}
}
return false;
}
}
return true;
}
5 运行结果
6 源代码
public class Solution {
public void solveSudoku(char[][] board) {
if (board == null || board.length == 0)
return;
//开始解题
searchRes(board);
}
private boolean searchRes(char[][] board) {
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board[0].length; j++) {
//不需要填充的空格直接跳过
if (board[i][j] != '.') {
continue;
}
//需要填充的空格慢慢补充
for (char num = '1'; num <= '9'; num++) {
//不合法则直接跳过
if (!isValid(board, i, j, num)) {
continue;
}
board[i][j] = num;
//如果能够成功
if (searchRes(board)) {
return true;
//否则回退
} else {
board[i][j] = '.';
}
}
return false;
}
}
return true;
}
private boolean isValid(char[][] board, int i, int j, char v) {
//比较一行的差别
for (int row = 0; row < 9; row++) {
if (board[row][j] == v) {
return false;
}
}
//比较一列的差别
for (int col = 0; col < 9; col++) {
if (board[i][col] == v) {
return false;
}
}
//比较一宫的差别
for (int row = i / 3 * 3; row < i / 3 * 3 + 3; row++) {
for (int col = j / 3 * 3; col < j / 3 * 3 + 3; col++) {
if (board[row][col] == v) {
return false;
}
}
}
return true;
}
}