按照人的思维来做的。

MyPos 就是 数组 行 列值。

public  class CalcShuDu
{
public int[][] IArrSd;
public int IBlankCount;
public Dictionary<MyPos, List<int>> DicCanFill;
public Dictionary<MyPos, List<int>> DicFilling;
Dictionary<MyPos, int> dic = new Dictionary<MyPos, int>();
public CalcShuDu(int[][] arr)
{ IArrSd = arr; for (int i = 0; i < arr.Length; i++)
{
for (int j = 0; j < arr[i].Length; j++)
{
if (arr[i][j] == 0)
{
IBlankCount++;
MyPos p = new MyPos(i, j);
dic.Add(p, 0); }
}
} } public Dictionary<MyPos, int> GetAnswer()
{
DicFilling = new Dictionary<MyPos, List<int>>(); GetCanFill();
var keys = dic.Keys.ToList(); int fillCount = 0;
bool isAdd = false; while (fillCount<= IBlankCount-1)
{
isAdd = false; if (fillCount < 0)
{
return dic;
} var key = keys[fillCount]; if (DicFilling[key].Count>= DicCanFill[key].Count)
{ DicFilling[key].Clear();
IArrSd[key.X][key.Y] = 0;
fillCount -= 1;
key= keys[fillCount];
IArrSd[key.X][key.Y] = 0; continue;
} var listCanFill = GetCanFill(key); if (listCanFill.Count == 0)
{
IArrSd[key.X][key.Y] = 0;
fillCount -= 1;
key = keys[fillCount]; IArrSd[key.X][key.Y] = 0;
}
else
{
foreach (var item in listCanFill)
{
if (!DicFilling[key].Contains(item))
{
IArrSd[key.X][ key.Y] = item;
DicFilling[key].Add(item);
fillCount += 1;
dic[key] = item;
isAdd = true;
break;
}
} if (!isAdd)
{
IArrSd[key.X][key.Y] = 0;
DicFilling[key].Clear();
fillCount -= 1;
key=keys[fillCount];
IArrSd[key.X][key.Y] = 0;
} }
}
return dic;
} public void GetCanFill()
{
DicCanFill = new Dictionary<MyPos, List<int>>(); var keys = dic.Keys.ToList();
foreach (var key in keys)
{ List<int> list1 = new List<int>();
DicFilling.Add(key, list1);
List<int> list = new List<int>(); int i = key.X;
int j = key.Y; var arr = IArrSd[i]; for (int k = 0; k < arr.Length; k++)
{
if(arr[k] != 0)
{
list.Add(arr[k]);
}
} for (int m = 0; m < 9; m++)
{
if (IArrSd[m][j] != 0)
{
if(!list.Contains(IArrSd[m][j]))
list.Add(IArrSd[m][j]);
}
} var ninePos = GetNinePos(key); for (int m = ninePos.X; m < ninePos.X+3; m++)
{
for (int k = ninePos.Y; k < ninePos.Y+3; k++)
{
if (IArrSd[m][k] != 0)
{
if (!list.Contains(IArrSd[m][k]))
list.Add(IArrSd[m][k]);
}
}
}
list.Sort(); var lstCanFill=new List<int>(); for (int m = 1; m < 10; m++)
{
if (!list.Contains(m))
{
lstCanFill.Add(m);
}
}
DicCanFill.Add(key, lstCanFill); }
} public MyPos GetNinePos(MyPos pos)
{
int i = 0;
int j = 0;
int x=pos.X;
int y=pos.Y;
if (x >= 0 && x < 3)
{
if (y >= 0 && y < 3)
{
i = 0;
j= 0;
}
else if (y >= 3 && y < 6)
{
i = 3;
j = 0;
}
else
{
i = 6;
j = 0;
}
}
else if (x >= 3 && x < 6)
{
if (y >= 0 && y < 3)
{
i = 0;
j = 3;
}
else if (y >= 3 && y < 6)
{
i = 3;
j = 3;
}
else
{
i = 6;
j = 3;
}
}
else
{
if (y >= 0 && y < 3)
{
i = 0;
j = 6;
}
else if (y >= 3 && y < 6)
{
i = 3;
j = 6;
}
else
{
i = 6;
j = 6;
}
}
return new MyPos(j,i);
} public List<int>GetCanFill(MyPos key)
{ var list = new List<int>(); int i = key.X;
int j = key.Y; var arr = IArrSd[i]; for (int k = 0; k < arr.Length; k++)
{
if (arr[k] != 0)
{
list.Add(arr[k]);
}
} for (int m = 0; m < 9; m++)
{
if (IArrSd[m][j] != 0)
{
if (!list.Contains(IArrSd[m][j]))
list.Add(IArrSd[m][j]);
}
} var ninePos = GetNinePos(key); for (int m = ninePos.X; m < ninePos.X + 3; m++)
{
for (int k = ninePos.Y; k < ninePos.Y + 3; k++)
{
if (IArrSd[m][k] != 0)
{
if (!list.Contains(IArrSd[m][k]))
list.Add(IArrSd[m][k]);
}
}
}
list.Sort(); var lstCanFill = new List<int>(); for (int m = 1; m < 10; m++)
{
if (!list.Contains(m))
{
lstCanFill.Add(m);
}
} return lstCanFill;
}
}

C# 数独 解法的更多相关文章

  1. 数独GUI程序项目实现

    数独GUI程序项目实现 导语:最近玩上了数独这个游戏,但是找到的几个PC端数独游戏都有点老了...我就想自己做一个数独小游戏,也是一个不错的选择. 前期我在网上简单地查看了一些数独游戏的界面,代码.好 ...

  2. Vijos1755 靶形数独 Sudoku NOIP2009 提高组 T4 舞蹈链 DLX

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目(传送门) 题意概括 给出一个残缺的数独,求这个数独中所有的解法中的最大价值. 一个数独解法的价值之和为每个位置所填的数值 ...

  3. 创建随机的9x9数独游戏终盘并打印

    创建随机的9x9数独游戏终盘并打印 项目github地址 1. 项目相关要求 1.1 要求 利用程序随机构造出N个已解答的9x9数独棋盘 . 输入 数独棋盘题目个数N(0<N<=10000 ...

  4. 2017BUAA软工个人作业Week1

    大概的功能已经满足 暂时只能用debug中的exe文件 正在改进... https://github.com/qwellk/project1/tree/product1 PSP2.1 Personal ...

  5. 浅入 dancing links x(舞蹈链算法)

    abastract:利用dancing links 解决精确覆盖问题,例如数独,n皇后问题:以及重复覆盖问题. 要学习dacning links 算法,首先要先了解该算法适用的问题,精确覆盖问题和重复 ...

  6. [转]MegCup2015初赛题

    原文链接 门票题:数独有多少种对解线上没有1的填法? 这道"门票题"虽说只是"热身",但还是有一定难度的.共有245名选手通过各种方法拿到了门票.下面,我们就为 ...

  7. node.js Web应用框架Express入门指南

    node.js Web应用框架Express入门指南 作者: 字体:[增加 减小] 类型:转载 时间:2014-05-28 我要评论 这篇文章主要介绍了node.js Web应用框架Express入门 ...

  8. 36、有效的数独 | 算法(leetode,附思维导图 + 全部解法)300题

    零 标题:算法(leetode,附思维导图 + 全部解法)300题之(36)有效的数独 前言 1)码农三少 ,一个致力于 编写极简.但齐全题解(算法) 的博主. 2)文末附赠 价值上百美刀 资料. 一 ...

  9. 数独的C++解法

    grid.h #ifndef _GRID_H_ #define _GRID_H_ #include <set> #include <cstddef> class Grid { ...

  10. [LeetCode] Sudoku Solver 求解数独

    Write a program to solve a Sudoku puzzle by filling the empty cells. Empty cells are indicated by th ...

随机推荐

  1. Git 12 IDEA上传本地项目到远程

    这里以上传 Spring 开源项目到 Gitee 为例: 1.点击 Create Git Repository 2.选择项目目录 3.添加到缓存库 4.提交到本地库 5.复制远程库地址 6.推送到远程 ...

  2. 踩坑指南:入门OpenTenBase之部署篇

    引言 OpenTenBase 企业级分布式HTAP开源数据库,具备高扩展性.商业数据库语法兼容.分布式HTAP引擎.多级容灾和多维度资源隔离等能力,成功应用在金融.医疗.航天等行业的核心业务系统. 这 ...

  3. 第二十一篇:信号、缓存、中间件、Form操作

    一.CSRF 二.中间件 三.缓存 四.信号 五.Form操作

  4. 有用的JavaScript技巧

    首次为变量赋值时务必使用var关键字 变量没有声明而直接赋值得话,默认会作为一个新的全局变量,要尽量避免使用全局变量. 使用===取代== ==和!=操作符会在需要的情况下自动转换数据类型.但===和 ...

  5. ddddocr基本使用和介绍

    ddddocr基本使用和介绍 摘要:在使用爬虫登录网站的时候,经常输入用户名和密码后会遇到验证码,这时候就需要用到今天给大家介绍的python第三方库ddddocr,ddddocr是一款强大的通用开源 ...

  6. 开箱即用!Linux 内核首个原生支持,让你的容器体验飞起来!| 龙蜥技术

    简介: 本文将从 Nydus 架构回顾.RAFS v6 镜像格式和 EROFS over Fscache 按需加载技术三个角度来分别介绍这一技术的演变历程. 文/阿里云内核存储团队,龙蜥社区高性能存储 ...

  7. Spring Boot Admin 集成诊断利器 Arthas 实践

    简介: Arthas 是 Alibaba 开源的 Java 诊断工具,具有实时查看系统的运行状况:查看函数调用参数.返回值和异常:在线热更新代码:秒解决类冲突问题:定位类加载路径:生成热点:通过网页诊 ...

  8. 云原生数据仓库TPC-H第一背后的Laser引擎大揭秘

    简介: 作者| 魏闯先阿里云数据库资深技术专家 一.ADB PG 和Laser 计算引擎的介绍 (一)ADB PG 架构 ADB PG 是一款云原生数据仓库,在保证事务ACID 能力的前提下,主要解决 ...

  9. 实操指南 | Resource Queue如何实现对AnalyticDB PostgreSQL的资源管理?

    简介: 作者:阿里云数据库OLAP产品部 - 子华 一 背景 AnalyticDB PostgreSQL版(简称ADB PG)是阿里云数据库团队基于PostgreSQL内核(简称PG)打造的一款云原生 ...

  10. Quick BI V4.0功能“炸弹”来袭,重磅推出即席分析、模板市场、企业微信免密登录等强势功能

    简介: 2021年7月,Quick BI公共云版本迭代新功能:重磅推出即席分析.模板市场,分析门槛再降低:推出企业微信无缝对接,移动端类目个性配置及管理提升多端能力:数据建模配置交互升级至拖拽模式提升 ...