C#实现数独解法
作者:天方 发布时间:2022-10-25 18:22:43
标签: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();
}
}
算法非常简单,大概就五六十行的样子,这种简单的算法自然谈不上高效,那些讨论数独算法的时间复杂度和空间复杂度的话题不在本文讨论范围之列。
来源:https://www.cnblogs.com/TianFang/archive/2008/12/18/1357840.html


猜你喜欢
- Android init.rc文件详解本文主要来自$ANDROID_SOURCE/system/init/readme.txt的翻译.1 简
- 本文实例为大家分享了java实现打砖块小游戏的具体代码,供大家参考,具体内容如下源码共包含两个文件文件1:play_zhuankuai.ja
- 问题描述Spring Cache提供的@Cacheable注解不支持配置过期时间,还有缓存的自动刷新。我们可以通过配置CacheManneg
- 在eclipse中默认的maven,它加载的是国外的镜像,那样速度会比较慢,如果使用国内镜像,比如阿里的中央仓库;速度会快很多。那如何修改m
- Eclipse 中的 GitEclipse 附带了一个名为 Egit 的插件,它提供了一个非常完善的 Git 操作接口。 这个插件可以通过切
- 本文实例为大家分享了Unity实现VR中在黑板上写字的具体代码,供大家参考,具体内容如下一、工具1.开发用的是Unity 5.6.2版本2.
- 1.RSA加密算法是一种非对称加密算法。在公开密钥加密和电子商业中RSA被广泛使用。RSA公开密钥密码体制。所谓的公开密钥密码体制就是使用不
- 目录截屏AudioRecord音频采集MediaCodec编码音频数据Rtp发送数据SDP文件配置音频config配置计算方式:vlc测试播
- C#剪切板Clipboard类我们现在先来看一下官方文档的介绍位于:System.Windows.Forms 命名空间下Provides m
- 1. 前言我们知道,在日常开发中使用的 HashMap 是线程不安全的,而线程安全类 HashTable 和 SynchronizedMap
- 先给大家这是下效果图:谷歌提供的v4包,ViewPager在布局文件中,先添加<android.support.v4.view.Vie
- 本文实例为大家分享了C#访问共享文件夹或者磁盘的具体代码,供大家参考,具体内容如下SharedTool:using System; &nbs
- 前言本文简单介绍抽象类,接口以及它们的异同点,另附简单的代码举例。一、抽象类是什么?在 Java 语言中使用 abstract class
- 前言这个也是Java实验课程的一个作业,和Java实现简单的图形界面计算器一起做的,因为以前没有做过GUI编程,所以做的非常简陋,还有很多B
- 创建项目在主界面的左侧菜单选 新建在向导中选择 输入项目名称,类型选择 构建一个自由风格的软件项目点确定进入项目的配置界面源码管理 选择gi
- 注解@Validated和BindingResult对入参非空校验在项目当中少不了入参校验,服务器和浏览器互不信任,不能因为前端加入参判断了
- 本文以在chart控件上和窗体上画矩形为例子讲述了C# GDI在控件上绘图的方法。分享给大家供大家参考。具体方法如下:具体的实现方法就不多解
- JDK8已发布,写了一个datetime时间函数使用方法的小示例package datetime;import static java.ti
- .NET包含一个特殊的Object类,可以接受任意的数据类型的值,当所传递或所赋值的类型不是一个特定的数据类型时,object类就提供了一种
- Spring BeanPostProcessor执行顺序首先 Spring 通过调用构造方法创建 User 对象;User 对象创建好之后,