C#實(shí)現(xiàn)數(shù)獨(dú)解法
數(shù)獨(dú)簡介
數(shù)獨(dú)(shù dú)是源自18世紀(jì)瑞士的一種數(shù)學(xué)游戲。是一種運(yùn)用紙、筆進(jìn)行演算的邏輯游戲。玩家需要根據(jù)9×9盤面上的已知數(shù)字,推理出所有剩余空格的數(shù)字,并滿足每一行、每一列、每一個(gè)粗線宮(3*3)內(nèi)的數(shù)字均含1-9,不重復(fù) [1] 。
數(shù)獨(dú)盤面是個(gè)九宮,每一宮又分為九個(gè)小格。在這八十一格中給出一定的已知數(shù)字和解題條件,利用邏輯和推理,在其他的空格上填入1-9的數(shù)字。使1-9每個(gè)數(shù)字在每一行、每一列和每一宮中都只出現(xiàn)一次,所以又稱“九宮格”。
實(shí)現(xiàn)方式
今天晚上抽空把數(shù)獨(dú)的計(jì)算機(jī)求解也給實(shí)現(xiàn)了一下,由于時(shí)間有限,我這里追求的是簡潔而有效的解法,故用的是最原始而直觀的回溯算法。速度也還可以接受,解網(wǎng)上最難的數(shù)獨(dú)也大概就0.0X秒的樣子。最開始是一個(gè)面向過程的實(shí)現(xiàn),考慮到用的是C#的實(shí)現(xiàn),便把這個(gè)算法給OO化了一下。
class Sudoku
{
public int[,] Numbers { get; set; }
int x;
int y;
public Sudoku(int[,] num)
{
Numbers = num;
for (x = 0; x < 9; x++)
{
for (y = 0; y < 9; y++)
{
if (Numbers[x, y] == 0)
return;
}
}
}
public bool IsCompleted { get { return x == 9 && y == 9; } }
//計(jì)算數(shù)獨(dú),返回null表示無法計(jì)算
public Sudoku CaluSudoKu()
{
if (IsCompleted)
return this;
foreach (var num in GetAvaibleNumbers())
{
var tmpData = Numbers.Clone() as int[,];
tmpData[x, y] = num;
var sudouku = new Sudoku(tmpData);
var ret = sudouku.CaluSudoKu();
if (ret != null)
return ret;
}
return null;
}
int[] GetAvaibleNumbers()
{
var set = new HashSet<int>(new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 });
for (int i = 0; i < 9; i++)
{
set.Remove(Numbers[x, i]);
set.Remove(Numbers[i, y]);
}
int xStart = x - x % 3;
int yStart = y - y % 3;
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
set.Remove(Numbers[i + xStart, j + yStart]);
}
}
return set.ToArray();
}
}算法非常簡單,大概就五六十行的樣子,這種簡單的算法自然談不上高效,那些討論數(shù)獨(dú)算法的時(shí)間復(fù)雜度和空間復(fù)雜度的話題不在本文討論范圍之列。
到此這篇關(guān)于C#實(shí)現(xiàn)數(shù)獨(dú)解法的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
UnityWebRequest前后端交互實(shí)現(xiàn)過程解析
這篇文章主要介紹了UnityWebRequest前后端交互實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06
使用C#實(shí)現(xiàn)一個(gè)簡單的繪圖工具
這篇文章主要為大家詳細(xì)介紹了如何使用C#開發(fā)的簡單繪圖工具,可以將簽名簡單繪圖后的效果以圖片的形式導(dǎo)出,有需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-02-02
c#讀取excel數(shù)據(jù)的兩種方法實(shí)現(xiàn)
這篇文章主要介紹了c#讀取excel數(shù)據(jù)的兩種方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
C#項(xiàng)目彩票選號(hào)實(shí)現(xiàn)思路
今天做了一個(gè)彩票選號(hào)的小軟件,將學(xué)到的知識(shí)點(diǎn)總結(jié)一下,下面通過本文給大家分享C#項(xiàng)目彩票選號(hào)實(shí)現(xiàn)思路,感興趣的朋友跟隨小編一起看看吧2024-08-08

