程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> leetcode筆記:Sudoku Solver

leetcode筆記:Sudoku Solver

編輯:C++入門知識

leetcode筆記:Sudoku Solver


一.題目描述

Write a program to solve a Sudoku puzzle by filling the empty cells.
Empty cells are indicated by the character ‘.’.
You may assume that there will be only one unique solution.

The following photo is a sudoku puzzle…

這裡寫圖片描述

…and its solution numbers marked in red:<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwPjxpbWcgYWx0PQ=="這裡寫圖片描述" src="http://www.bkjia.com/uploads/allimg/151012/06011140G-1.png" title="\" />

二.題目分析

注意題目說明了輸入保證有且只有一個解,所以試探每一個格子的時候,只需要考慮當前行、列、矩形框滿足條件,滿足就進入下一個格子試探,不滿足回溯。

首先,編寫一個函數isValidSudoku()用於測試矩陣當前坐標的值是否合法,檢查當前值在行、列以及3*3的矩陣內是否有效。

於是,對於矩陣中的每個空位'.',嘗試填入1~9 並檢查是否合法,正確則往下一個位置遞歸。

只有正確達到矩陣最右下角位置才算填充成功,此時返回填充結果。

關於回朔算法,以下博客寫得淺顯易懂,可以參考參考:

http://www.cnblogs.com/steven_oyj/archive/2010/05/22/1741376.html
http://www.cnblogs.com/Creator/archive/2011/05/20/2052341.html

三.示例代碼

#include 
#include 
using namespace std;

class Solution {
public:
    bool isValidSudoku(vector > &board, int x, int y) {

        // 同一列中是否出現相同的數
        for (int row = 0; row < 9; ++row) 
            if ((x != row) && (board[row][y] == board[x][y])) 
                return false;

        // 同一行中是否出現相同的數
        for (int col = 0; col < 9; ++col)
            if ((y != col) && (board[x][col] == board[x][y]))
                return false;

        // 3 * 3方格中是否出現相同的數
        for (int row = (x / 3) * 3; row < (x / 3 + 1) * 3; ++row) 
            for (int col = (y / 3) * 3; col < (y / 3 + 1) * 3; ++col) 
                if ((x != row) && (y != col) && (board[row][col] == board[x][y])) 
                    return false;

        // 滿足條件,則返回true
        return true;
    }

    bool internalSolveSudoku(vector > &board) {
        for (int row = 0; row < 9; ++row) 
        {
            for (int col = 0; col < 9; ++col) 
            {
                if (board[row][col] == '.') 
                {
                    for (int i = 1; i <= 9; ++i)
                    {
                        board[row][col] = '0' + i;

                        if (isValidSudoku(board, row, col)) 
                            if (internalSolveSudoku(board)) 
                                return true;
                        // 若當前格子的數不正確,將其重置為'.'
                        // 然後進行下一個嘗試
                        board[row][col] = '.';
                    }
                    // 0~9均重復,輸出false
                    return false;
                }
            }
        }
        return true;
    }

    void solveSudoku(vector > &board) 
    {
        internalSolveSudoku(board);
    }
};

結果:

這裡寫圖片描述

四.小結

題目規定,輸入保證是有效的,因此每填入一個數,無需檢查整個矩陣是否合法,只需檢查填入數當前行、列和3*3矩陣是否合法即可。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved