算法設計與分析 第十三週 解數獨


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;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章