程式設計之美之數獨求解器的C 實現方法

2021-07-03 11:27:15 字數 2452 閱讀 6999

程式設計之美的第一章的第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數獨知多少

問題 一共有多少種不同的數獨解答呢?其中有多少種是獨立的解答呢?如果用乙個字串來表示各種數獨,如何保證一一對應的基礎上,讓字串的長度最短?分析 首先要明確問題,獨立的解答到底是什麼?如何定義 獨立 這種關係?如果任意交換數獨的兩個數字,仍然是乙個合法的數獨。那麼我們可以定義 如果兩個數獨解答可以通過...