C# 数独算法——LINQ+委托
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace SingleNumber
{
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int[] source =
{
, , , , , , , , ,
, , , , , , , , ,
, , , , , , , , ,
, , , , , , , , ,
, , , , , , , , ,
, , , , , , , , ,
, , , , , , , , ,
, , , , , , , , ,
, , , , , , , ,
}; // http://www.sudoku.name/index-cn.php #10332 数独来自这个网站
int[] result = source.ToArray(); // result数组保存解算中间数据和结果
Func<bool> IsFinished = () => result.Where(x => x == ).Count() == ; // 判断是否解算完成
Func<int> NextNumber = () => result.Select((x, i) => new {x, i}).First(x => x.x == ).i; // 取下一个空格(这个算法不是唯一的,你也可以从后往前填写,或者别的方法)
Func<IEnumerable<int>> TryValues = () =>
{
int pos = NextNumber(); // 获取空格
int col = pos % ; // 行号
int row = pos / ; // 列号
int group = (row / ) * + col / ; // 宫号
var colnums = Enumerable.Range(, ).Except(Enumerable.Range(, ).Where(x => x % == col).Select(x => result[x]).Where(x => x != )); // 让1-9和本列已有数据对比,求差集,差集是对于列,允许填入的数字,下面类似
var rownums = Enumerable.Range(, ).Except(Enumerable.Range(, ).Where(x => x / == row).Select(x => result[x]).Where(x => x != ));
var groupnumbers = Enumerable.Range(, ).Except(Enumerable.Range(, ).Where(x => ((x / ) / ) * + (x % ) / == group).Select(x => result[x]).Where(x => x != ));
return colnums.Intersect(rownums).Intersect(groupnumbers); //数据是行、列、宫的交集
}; // 找出填写这个空格的所有可能尝试的数据 Action DisplayResult = () => Console.WriteLine(string.Join("\r\n", result.Select((x, i) => new
{x, i}).GroupBy(x => x.i / ).Select(x => string.Join(" ", x.Select(y => y.x))))); // 显示结果
Action Solve = () => { }; // 递归Lambda必须先定义一个空的。
Solve = () =>
{
if (IsFinished())
{
DisplayResult(); //如果全部填满,就输出结果(严格地,应该考虑无解的情况,这里忽略)
}
else
{
int pos = NextNumber(); // 获取空格位置
foreach (int item in TryValues()) // 依次尝试所有可能的数字
{
result[pos] = item; // 将盘面设置为尝试数字
Solve(); //下一层解算
}
result[pos] = ; // 尝试完还不行,恢复盘面,回溯上一层
}
}; // 算法主体
Solve(); // 开始解算
Console.Read();
}
}
}
}
C# 数独算法——LINQ+委托的更多相关文章
- 36、有效的数独 | 算法(leetode,附思维导图 + 全部解法)300题
零 标题:算法(leetode,附思维导图 + 全部解法)300题之(36)有效的数独 前言 1)码农三少 ,一个致力于 编写极简.但齐全题解(算法) 的博主. 2)文末附赠 价值上百美刀 资料. 一 ...
- 一次数独生成及解题算法的剖析(Java实现)
数独生成及解题算法剖析(Java实现) 关键词 数独9x9 数独生成算法 数独解题算法 序言 最近业务在巩固Java基础,编写了一个基于JavaFX的数独小游戏(随后放链接).写到核心部分发现平时玩的 ...
- 委托(C# 编程指南)
原文地址:https://msdn.microsoft.com/zh-cn/library/ms173171.aspx delegate 是表示对具有特定参数列表和返回类型的方法的引用的类型. 在实例 ...
- 回溯法、数独与N阶可达问题
回溯法是剪了枝的穷举,这是字面上的说法,不太好理解,不如讲解实例来的酸爽,于是引出了N阶可达问题: 有N个国家,每个国家有若干城市,小明要从中国(任意一个城市)出发,遍历所有国家(假设这个遍历顺序已经 ...
- [2017BUAA软工]第一次个人项目 数独的生成与求解
零.Github链接 https://github.com/xxr5566833/sudo 一.PSP表格 PSP2.1 Personal Software Process Stages 预估耗时(分 ...
- [2017BUAA软工]结对项目-数独程序扩展
零.github地址 GitHub地址:https://github.com/Liu-SD/SudoCmd (这个地址是命令行模式数独的仓库,包含了用作测试的BIN.DLL核心计算模块地址是:http ...
- C++设计模式-Strategy策略模式
Strategy策略模式作用:定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户. UML图: Strategy模式将逻辑(算法)封装到一个类(Cont ...
- 策略模式c++【转】
作用:定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户. UML图: Strategy模式将逻辑(算法)封装到一个类(Context)里面,通过组合的 ...
- (摘)使用 .NET Core 实现依赖关系注入
为什么使用依赖关系注入? 使用 .NET,通过 new 运算符(即,new MyService 或任何想要实例化的对象类型)调用构造函数即可轻松实现对象实例化.遗憾的是,此类调用会强制实施客户端(或应 ...
随机推荐
- 【转贴】一次 JDBC 与 MySQL 因 “CST” 时区协商误解导致时间差了 14 或 13 小时的排错经历
原文:https://juejin.im/post/5902e087da2f60005df05c3d ------------------------------------------------- ...
- js获取时间相关函数
js获取时间函数 var myDate = new Date; var year = myDate.getFullYear();//获取当前年 var yue = myDate.getMonth()+ ...
- Win10 Service'MongoDB Server' failed to start. Verify that you have sufficient privileges to start system services【简记】
最近工作中有需要用到 MongoDB数据库,以前用的3.*的版本,这次用的是较新4.0.6的版本,然后去官网下载安装. 安装到一半,就弹出如下提示,说是"MongoDB Server&quo ...
- 英语口语练习系列-C14-常用片语
句子 1. Some ads are extremely persuasive and we find we buy products we don't really need. 有一些广告非常有说服 ...
- RabbitMQ消费者消息权重,
有的消费者处理速度快,有的消费者处理速度慢,我们想给处理快的多发消息,处理慢的少发消息, 怎么办呢?按照之前的轮询模式,肯定不行的,这里可以检测消息数量,如果消费者正在处理就不给他发 .... def ...
- HBase源码实战:ImportTsv
/** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agr ...
- Linux:Day13(上) CentOS系统启动流程
CentOS 5和6的启动流程 Linux:kernel+rootfs kernel:进程管理.内存管理.网络管理.驱动程序.文件系统.安全功能 rootfs: glibc 库:函数集合,functi ...
- Golang 入门系列(七) Redis的使用
安装 1. Redis 的安装很简单,我这里测试直接用的是windows 的版本.如何安装就不细说了.想了解的可以看之前的文章:https://www.cnblogs.com/zhangweizhon ...
- 关于H5页面中生成图片的两种方式!
前言: 我们在做项目过程中,经常会遇到自定义生成一张图片并可以长按保存.长按保存图片在微信等浏览器中默认就有,那么对于生成图片的有哪些方式呢? 方法一: 利用canvas绘制图形,然后生成图片 代码如 ...
- mysql多表多字段查询并去重
mysql多表多字段查询并去重 - MySQL-ChinaUnix.nethttp://bbs.chinaunix.net/forum.php?mod=viewthread&tid=42549 ...