亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C#實(shí)現(xiàn)數(shù)獨(dú)解法

 更新時(shí)間:2022年06月16日 11:03:42   作者:天方  
這篇文章介紹了C#實(shí)現(xiàn)數(shù)獨(dú)解法的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

數(shù)獨(dú)簡(jiǎn)介

數(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í)間有限,我這里追求的是簡(jiǎn)潔而有效的解法,故用的是最原始而直觀的回溯算法。速度也還可以接受,解網(wǎng)上最難的數(shù)獨(dú)也大概就0.0X秒的樣子。最開(kāi)始是一個(gè)面向過(guò)程的實(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表示無(wú)法計(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();
    }
}

算法非常簡(jiǎn)單,大概就五六十行的樣子,這種簡(jiǎn)單的算法自然談不上高效,那些討論數(shù)獨(dú)算法的時(shí)間復(fù)雜度和空間復(fù)雜度的話題不在本文討論范圍之列。

到此這篇關(guān)于C#實(shí)現(xiàn)數(shù)獨(dú)解法的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • SQLite在C#中的安裝與操作技巧

    SQLite在C#中的安裝與操作技巧

    SQLite,是一款輕型的數(shù)據(jù)庫(kù),用于本地的數(shù)據(jù)儲(chǔ)存。其優(yōu)點(diǎn)有很多,下面通過(guò)本文給大家介紹SQLite在C#中的安裝與操作技巧,感興趣的的朋友參考下吧
    2017-08-08
  • C#中緊耦合Tight Coupling和松耦合Loose Coupling的實(shí)現(xiàn)

    C#中緊耦合Tight Coupling和松耦合Loose Coupling的實(shí)現(xiàn)

    緊耦合和松耦合是描述模塊或組件之間耦合程度的兩個(gè)概念,本文主要介紹了C#中緊耦合Tight Coupling和松耦合Loose Coupling的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • C#實(shí)現(xiàn)讀取txt文件生成Word文檔

    C#實(shí)現(xiàn)讀取txt文件生成Word文檔

    大家好,本篇文章主要講的是C#實(shí)現(xiàn)讀取txt文件生成Word文檔,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • Unity實(shí)現(xiàn)噴漆效果

    Unity實(shí)現(xiàn)噴漆效果

    這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)噴漆效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • WPF拖動(dòng)DataGrid滾動(dòng)條時(shí)內(nèi)容混亂的解決方法

    WPF拖動(dòng)DataGrid滾動(dòng)條時(shí)內(nèi)容混亂的解決方法

    這篇文章主要介紹了WPF拖動(dòng)DataGrid滾動(dòng)條時(shí)內(nèi)容混亂的解決方法
    2016-10-10
  • 100行C#代碼實(shí)現(xiàn)經(jīng)典掃雷游戲

    100行C#代碼實(shí)現(xiàn)經(jīng)典掃雷游戲

    這篇文章主要為大家詳細(xì)介紹了如何用100行C#代碼實(shí)現(xiàn)經(jīng)典的掃雷游戲,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下
    2023-02-02
  • C#單例模式Singleton的實(shí)現(xiàn)詳解

    C#單例模式Singleton的實(shí)現(xiàn)詳解

    單例模式(Singleton?Pattern)是日常開(kāi)發(fā)中最簡(jiǎn)單的設(shè)計(jì)模式之一,它提供了一種創(chuàng)建對(duì)象的最佳方式,本文主要為大家介紹的是C#單例模式的實(shí)現(xiàn)方法,需要的可以參考一下
    2023-05-05
  • C#實(shí)現(xiàn)FTP文件下載及超時(shí)控制詳解

    C#實(shí)現(xiàn)FTP文件下載及超時(shí)控制詳解

    這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)FTP文件下載及超時(shí)控制的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03
  • C#操作windows系統(tǒng)進(jìn)程的方法

    C#操作windows系統(tǒng)進(jìn)程的方法

    這篇文章主要介紹了C#操作windows系統(tǒng)進(jìn)程的方法,涉及C#針對(duì)windows操作系統(tǒng)進(jìn)程的創(chuàng)建與關(guān)閉的技巧,需要的朋友可以參考下
    2015-04-04
  • C#多線程處理多個(gè)隊(duì)列數(shù)據(jù)的方法

    C#多線程處理多個(gè)隊(duì)列數(shù)據(jù)的方法

    本文將結(jié)合實(shí)例代碼,介紹C#多線程處理多個(gè)隊(duì)列數(shù)據(jù)的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-06-06

最新評(píng)論