C#实现数独解法

 更新时间:2022年06月16日 11:03:42   作者:天方  
这篇文章介绍了C#实现数独解法的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

数独简介

数独(shù dú)是源自18世纪瑞士的一种数学游戏。是一种运用纸、笔进行演算的逻辑游戏。玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个粗线宫(3*3)内的数字均含1-9,不重复 [1]  。
数独盘面是个九宫,每一宫又分为九个小格。在这八十一格中给出一定的已知数字和解题条件,利用逻辑和推理,在其他的空格上填入1-9的数字。使1-9每个数字在每一行、每一列和每一宫中都只出现一次,所以又称“九宫格”。

实现方式

今天晚上抽空把数独的计算机求解也给实现了一下,由于时间有限,我这里追求的是简洁而有效的解法,故用的是最原始而直观的回溯算法。速度也还可以接受,解网上最难的数独也大概就0.0X秒的样子。最开始是一个面向过程的实现,考虑到用的是C#的实现,便把这个算法给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; } }

    //计算数独,返回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();
    }
}

算法非常简单,大概就五六十行的样子,这种简单的算法自然谈不上高效,那些讨论数独算法的时间复杂度和空间复杂度的话题不在本文讨论范围之列。

到此这篇关于C#实现数独解法的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • SQLite在C#中的安装与操作技巧

    SQLite在C#中的安装与操作技巧

    SQLite,是一款轻型的数据库,用于本地的数据储存。其优点有很多,下面通过本文给大家介绍SQLite在C#中的安装与操作技巧,感兴趣的的朋友参考下吧
    2017-08-08
  • C#中紧耦合Tight Coupling和松耦合Loose Coupling的实现

    C#中紧耦合Tight Coupling和松耦合Loose Coupling的实现

    紧耦合和松耦合是描述模块或组件之间耦合程度的两个概念,本文主要介绍了C#中紧耦合Tight Coupling和松耦合Loose Coupling的实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • C#实现读取txt文件生成Word文档

    C#实现读取txt文件生成Word文档

    大家好,本篇文章主要讲的是C#实现读取txt文件生成Word文档,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • Unity实现喷漆效果

    Unity实现喷漆效果

    这篇文章主要为大家详细介绍了Unity实现喷漆效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • WPF拖动DataGrid滚动条时内容混乱的解决方法

    WPF拖动DataGrid滚动条时内容混乱的解决方法

    这篇文章主要介绍了WPF拖动DataGrid滚动条时内容混乱的解决方法
    2016-10-10
  • 100行C#代码实现经典扫雷游戏

    100行C#代码实现经典扫雷游戏

    这篇文章主要为大家详细介绍了如何用100行C#代码实现经典的扫雷游戏,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以参考一下
    2023-02-02
  • C#单例模式Singleton的实现详解

    C#单例模式Singleton的实现详解

    单例模式(Singleton Pattern)是日常开发中最简单的设计模式之一,它提供了一种创建对象的最佳方式,本文主要为大家介绍的是C#单例模式的实现方法,需要的可以参考一下
    2023-05-05
  • C#实现FTP文件下载及超时控制详解

    C#实现FTP文件下载及超时控制详解

    这篇文章主要为大家详细介绍了C#实现FTP文件下载及超时控制的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-03-03
  • C#操作windows系统进程的方法

    C#操作windows系统进程的方法

    这篇文章主要介绍了C#操作windows系统进程的方法,涉及C#针对windows操作系统进程的创建与关闭的技巧,需要的朋友可以参考下
    2015-04-04
  • C#多线程处理多个队列数据的方法

    C#多线程处理多个队列数据的方法

    本文将结合实例代码,介绍C#多线程处理多个队列数据的方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-06-06

最新评论