程式設計之美的第一章的第15節,講的是構造數獨,一開始拿到這個問題的確沒有思路, 不過看了書中的介紹之後, 發現原來這個的求解思路和n皇后問題是一致的, 但是不知道為啥,反正一開始確實沒有想到這個回溯法,知道是用回溯法求解之後,問題就變得容易了很多。
這裡我們不打算實現數獨的構造,相反的,我們實現乙個數獨求解器,以後媽媽再也不用擔心我的數獨了。
當然求解器的思路和構造數獨的思路一樣,都是回溯法搜尋,這裡不再過多說明。
程式執行說明:
1.把待求解的數獨資料放到in.txt檔案中, 程式會自動讀取他,並將解輸出到螢幕和out.txt檔案中。
2.控制台顏色改變 使用了setconsoletextattribute函式,具體使用細節可以參考 c/c++改變控制台輸出字型的背景和顏色(windows)
3.關於程式執行時間統計,使用gettickcount()或者clock()都是可以的
執行效果如下:
紅色表示部分就是求解出來的值了》_
按照慣例下面是原始碼:
// ***************=【shudu.h】**********=
#pragma once
#define n 9
#include
typedef struct _searchnode
searchnode;
class cshudu
;
// ********************=【shudu.cpp】***************===
#include
#include "shudu.h"
#include
#include
#include
#include
cshudu::cshudu()
cshudu::~cshudu()
void cshudu::createsolution()
bool cshudu::isok(int row, int col)
// 行檢測
for (int i = 1; i != 10; i++)
// 區域檢測
int block_start_row = (row - 1) / 3 * 3 + 1;
int block_start_col = (col - 1) / 3 * 3 + 1;
for (int i = block_start_row; i != block_start_row + 3; i++)
}return isok;
}void cshudu::solve(int searchnode_id)
for (int i = 1; i != 10; i++)
}}void cshudu::display(int id)
else
setconsoletextattribute(handle, foreground_intensity | foreground_red | foreground_blue | foreground_green);
std::cout
<< m_shudu[i][j] << " ";
}std::cout
<< std::endl;
}std::cout
<< std::endl;
std::cout
<< std::endl;
setconsoletextattribute(handle, foreground_intensity);
}void cshudu::writefile(int id)
outfile << std::endl;
}outfile << std::endl;
outfile << std::endl;
}void cshudu::output(int id)
void cshudu::initshudu()}}
}
// ********************=【數獨求解器 main.cpp】***************===
// @ author : zhyh2010
// @ date : 20150624
// @ version : 1.0
// @ description : c++
// ********************=【數獨求解器】***************===
#include
#include "shudu.h"
#include
void main()
程式設計之美1 15 構造數獨
問題 構造乙個9 9的方格矩陣,玩家要在每個方格中,分別填上1至9的任意乙個數字,讓整個棋盤每一列 每一行以及每乙個3 3的小矩陣中的數字都不重複。首先我們通過乙個深度優先搜尋來生成乙個可行解,然後隨機刪除一定數量的數字,以生成乙個數獨。include include using namespace...
程式設計之美 1 15 構造數獨
1.15 構造數獨 數獨的棋盤,由9 9 81個小方格組成,數獨要求每一行 每一列 以及每乙個3 3的小矩陣中的數字都不重複 深度優先搜尋,回溯法 從 0,0 開始,沒有處理的呼叫函式獲取可能的取值,取乙個為當前值,搜尋下乙個個子,搜尋過程中,若出現某個格仔沒有可行值,則回溯,修改前乙個格仔的取值 ...
程式設計之美 4 9數獨知多少
問題 一共有多少種不同的數獨解答呢?其中有多少種是獨立的解答呢?如果用乙個字串來表示各種數獨,如何保證一一對應的基礎上,讓字串的長度最短?分析 首先要明確問題,獨立的解答到底是什麼?如何定義 獨立 這種關係?如果任意交換數獨的兩個數字,仍然是乙個合法的數獨。那麼我們可以定義 如果兩個數獨解答可以通過...