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;
}
}