Linq的应用为我们带来了很大的方便,提高了coding效率,最近看到了一个用linq写的数独游戏算法,让我看到了Linq写的是如此优雅,耳目一新的感觉,以前没有写过这样的代码,同时也感觉到原来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();
}
}
}
}

代码注释的很详细,就不再解释了.欢迎爱好者一起讨论。

Linq高级应用的更多相关文章

  1. Webform(Linq高级查、分页、组合查询)

    一.linq高级查 1.模糊查(包含) 1 public List<User> Select(string name) 2 { 3 return con.User.Where(r => ...

  2. LinQ高级查询、组合查询、IQueryable集合类型

    LinQ高级查询: 1.模糊查询(包含) Repeater1.DataSource = con.car.Where(r =>r.name.Contains(s)).ToList(); 2.开头 ...

  3. Linq高级查询,分页查询及查询分页结合

    一.高级查询与分页查询 1.以...开头    StartsWith Repeater1.DataSource=con.Users.Where(r=>r.Nickname.StartsWith( ...

  4. 2017年12月14日 LinQ高级查&&Asp.net WebForm Asp.net MVC

    LinQ的高级查询用法 开头:StartsWith()结尾:EndsWith()模糊:Contains() 个数:Count最大值:Max(r => r.price)最小值:Min(r => ...

  5. LinQ 高级查询

    高级查询 模糊查(包含):.Contains(name) 开头:.StartsWith(name) 结尾:.EndsWith(name) 个数:.Count() 最大值:Max(r => r.p ...

  6. LINQ高级编程 笔记

    相关资料:http://www.cnblogs.com/lifepoem/archive/2011/12/16/2288017.html 1.什么是LINQ 语言集成查询是一系列标准查询操作符的集合, ...

  7. 【2017-06-02】Linq高级查询,实现分页组合查询。

    1.以XXX开头 2.以XXX结尾 3.模糊查询 4.求个数 5.求最大值 6.求最小值 7.求平均值 8.求和 9.升序 10.降序 11.分页 Skip()跳过多少条 Take()取多少条 12. ...

  8. Linq 高级应用实例

    using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Tex ...

  9. LinQ高级查询

    1.模糊查询 con.Users.Where(a =>a.UserName.Contains(name)).ToList(); //包含name con.Users.Where(a =>a ...

随机推荐

  1. easyui的dialog

    代码: <div id="titledialos" class="easyui-dialog" title="×××" data-op ...

  2. 随机数、方法重载和System.out.println()的理解

    1.编写一个方法,使用以上算法生成指定数目(比如1000个)的随机数. package testradom; public class testradom { public static void m ...

  3. 路径打印(set以及字符串的相关操作)

    题目链接 题目描述 给你一串路径,譬如: a\b\c a\d\e b\cst d\ 你把这些路径中蕴含的目录结构给画出来,子目录直接列在父目录下面,并比父目录向右缩一格,就像这样: a   b     ...

  4. datatable to entiy list 不支持可空类型和枚举类型

    还没有找到解决方法,暂存,希望有知道能告诉我.谢谢.

  5. tomcat用虚拟目录方式发布项目

    conf/Catalina/localhost:指定项目的配置信息 1.添加:ROOT.xml 听见Context节点: <Context docBase="/usr/local/to ...

  6. mybatis进阶--mapper输入映射和输出映射

    我们知道,mapper.xml是我们配置操作数据库的sql语句的地方.其中每个sql语句对应着一个方法,每个方法都有自己的输入输出参数类型.那么这些类型都是怎么配置的呢?今天我们来一起学习下. 输入映 ...

  7. iOS.Notification.Bar.Color

    Reference: http://apple.stackexchange.com/questions/44246/what-determines-the-special-color-of-the-s ...

  8. 201621123008 《Java程序设计》 第11周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 1. 源代码阅读:多线程程序BounceThread 1.1 BallR ...

  9. 201621123008 《Java 程序设计》 第九周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 2. 书面作业 本次作业题集集合 1. List中指定元素的删除(题集题目) 1.1 实验总结.并回答:列举至 ...

  10. Servlet 2.x 规范

    Servlet 2.x 规范 sun 公司制订的一种基于 Java 技术的 WEB 服务器功能的组件规范.1997 年六月,Servlet 1.0 版本发行,最新版本 Servlet 4.0 处于研发 ...