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 或任何想要实例化的对象类型)调用构造函数即可轻松实现对象实例化.遗憾的是,此类调用会强制实施客户端(或应 ...
随机推荐
- Got a packet bigger than‘max_allowed_packet’bytes错误的解决方法
通常项目上线前都有一些初始化数据需要导入,在今天博客系统发布前我使用sqlyog工具远程登录服务器的Mysql数据库,执行sql脚本对初始数据进行导入的时候报错: Got a packet bigge ...
- PHP程序污点型漏洞静态检测方法
这篇文献,作者针对基于PHP语言开发的web应用程序产生的污点型漏洞,提出了一种静态代码分析检测的方法. 先解释一下什么叫污点型漏洞,由于对于用户的输入没有进行有效的过滤,使其进入敏感函数 ...
- Git常用命令集锦
本篇Git命令博客主要是一些Git常用命令,适合于有一定Git或linux基础的小伙伴进行参考 1.新建文件夹 mkdir 文件夹名 2.查看目录机构: pwd 3.将文件添加至Git管理范围:git ...
- for循环和foreach循环遍历集合的效率比较
先上代码 package com.test; import java.util.ArrayList; import java.util.LinkedList; import java.util.Lis ...
- Python开发【内置模块篇】datetime
获取当前日期和时间 >>> from datetime import datetime >>> now = datetime.now() >>> ...
- Django-CRM项目学习(六)-rbac模块(权限组件)
1.rbac权限组件 1.1 模板分析(五表结构) 1.2 模板构建 人物和角色进行多对多绑定,角色与权限进行多对多绑定.其中人物和角色的多对多绑定的操作可以避免相同的人物多重权限的操作. 1.3 数 ...
- token
18f9nWvThC274lo3USjgfeldynt0t/r/w0yjLbj9 http://app-static.acc5.com/app/testpost.php
- python3 json模块
import json '''把python对象转化为json串(字符串), ensure_ascii处理中文乱码'''dic = {"复联4": "好看吗", ...
- ENABLE_DDL_LOGGING 参数使用 监控对象的DDL(在alter 日志记录DDL语句)
启用 DDL 日志记录 功能--支持动态调整 alter system set enable_ddl_logging=true; alter system set enable_ddl_logging ...
- 怎么在Vue的某个组件中根据组件tag标签名获取到对应的VueComponent实例呢
1.以前玩omi框架的时候,有Omi.get方法来获取实例, ...好久没玩了,忘了.反正很喜欢该方法.2.如今想在vue里面怎么能够快速获取到对应组件标签名的的实例呢?3.文档也看过,似乎脑海中没啥 ...