最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

數(shù)獨簡介

數(shù)獨(shù dú)是源自18世紀瑞士的一種數(shù)學(xué)游戲。是一種運用紙、筆進行演算的邏輯游戲。玩家需要根據(jù)9×9盤面上的已知數(shù)字,推理出所有剩余空格的數(shù)字,并滿足每一行、每一列、每一個粗線宮(3*3)內(nèi)的數(shù)字均含1-9,不重復(fù) [1]  。
數(shù)獨盤面是個九宮,每一宮又分為九個小格。在這八十一格中給出一定的已知數(shù)字和解題條件,利用邏輯和推理,在其他的空格上填入1-9的數(shù)字。使1-9每個數(shù)字在每一行、每一列和每一宮中都只出現(xiàn)一次,所以又稱“九宮格”。

實現(xiàn)方式

今天晚上抽空把數(shù)獨的計算機求解也給實現(xiàn)了一下,由于時間有限,我這里追求的是簡潔而有效的解法,故用的是最原始而直觀的回溯算法。速度也還可以接受,解網(wǎng)上最難的數(shù)獨也大概就0.0X秒的樣子。最開始是一個面向過程的實現(xiàn),考慮到用的是C#的實現(xiàn),便把這個算法給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; } }

    //計算數(shù)獨,返回null表示無法計算
    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ù)獨算法的時間復(fù)雜度和空間復(fù)雜度的話題不在本文討論范圍之列。

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

相關(guān)文章

  • UnityWebRequest前后端交互實現(xiàn)過程解析

    UnityWebRequest前后端交互實現(xiàn)過程解析

    這篇文章主要介紹了UnityWebRequest前后端交互實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-06-06
  • 使用C#實現(xiàn)一個簡單的繪圖工具

    使用C#實現(xiàn)一個簡單的繪圖工具

    這篇文章主要為大家詳細介紹了如何使用C#開發(fā)的簡單繪圖工具,可以將簽名簡單繪圖后的效果以圖片的形式導(dǎo)出,有需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-02-02
  • C#實現(xiàn)餐廳管理系統(tǒng)

    C#實現(xiàn)餐廳管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C#實現(xiàn)餐廳管理系統(tǒng),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • c# Task任務(wù)的取消方式

    c# Task任務(wù)的取消方式

    文章介紹了如何在C#中使用CancellationTokenSource和CancellationToken來取消任務(wù),通過Task.Run方法和CancellationToken參數(shù),可以控制任務(wù)的執(zhí)行,并在需要時取消它們,文章還討論了CancellationToken參數(shù)的重要性
    2024-12-12
  • c#讀取excel數(shù)據(jù)的兩種方法實現(xiàn)

    c#讀取excel數(shù)據(jù)的兩種方法實現(xiàn)

    這篇文章主要介紹了c#讀取excel數(shù)據(jù)的兩種方法實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • C#日期時間格式化小結(jié)

    C#日期時間格式化小結(jié)

    這篇文章主要介紹了C#中的時間與日期的格式化方法,需要的朋友可以參考下
    2013-09-09
  • C#實現(xiàn)合并及拆分PDF文件的方法

    C#實現(xiàn)合并及拆分PDF文件的方法

    這篇文章主要為大家詳細介紹了C#合并及拆分PDF文件的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C#項目彩票選號實現(xiàn)思路

    C#項目彩票選號實現(xiàn)思路

    今天做了一個彩票選號的小軟件,將學(xué)到的知識點總結(jié)一下,下面通過本文給大家分享C#項目彩票選號實現(xiàn)思路,感興趣的朋友跟隨小編一起看看吧
    2024-08-08
  • C#批量更新sql實例

    C#批量更新sql實例

    這篇文章主要介紹了C#批量更新sql的方法,詳細講述了其實現(xiàn)步驟與對應(yīng)的核心代碼,非常實用,需要的朋友可以參考下
    2014-10-10
  • c# 所有類型都從Object類型派生

    c# 所有類型都從Object類型派生

    所有的類型最終從object派生,每一個類型都有一組最基本的方法
    2012-10-10

最新評論

蓬安县| 池州市| 仙桃市| 梅河口市| 建昌县| 曲阜市| 台东市| 会宁县| 武冈市| 肃宁县| 措美县| 虹口区| 隆昌县| 平阳县| 辉县市| 沾益县| 沾化县| 元阳县| 永宁县| 深水埗区| 绥棱县| 浙江省| 康保县| 金溪县| 安溪县| 江油市| 苏尼特右旗| 酒泉市| 巩义市| 巴青县| 微山县| 沈丘县| 东兰县| 湘潭县| 泾阳县| 深泽县| 余江县| 望都县| 宁河县| 淳化县| 兴文县|