C# 数独 解法
按照人的思维来做的。
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# 数独 解法的更多相关文章
- 数独GUI程序项目实现
数独GUI程序项目实现 导语:最近玩上了数独这个游戏,但是找到的几个PC端数独游戏都有点老了...我就想自己做一个数独小游戏,也是一个不错的选择. 前期我在网上简单地查看了一些数独游戏的界面,代码.好 ...
- Vijos1755 靶形数独 Sudoku NOIP2009 提高组 T4 舞蹈链 DLX
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目(传送门) 题意概括 给出一个残缺的数独,求这个数独中所有的解法中的最大价值. 一个数独解法的价值之和为每个位置所填的数值 ...
- 创建随机的9x9数独游戏终盘并打印
创建随机的9x9数独游戏终盘并打印 项目github地址 1. 项目相关要求 1.1 要求 利用程序随机构造出N个已解答的9x9数独棋盘 . 输入 数独棋盘题目个数N(0<N<=10000 ...
- 2017BUAA软工个人作业Week1
大概的功能已经满足 暂时只能用debug中的exe文件 正在改进... https://github.com/qwellk/project1/tree/product1 PSP2.1 Personal ...
- 浅入 dancing links x(舞蹈链算法)
abastract:利用dancing links 解决精确覆盖问题,例如数独,n皇后问题:以及重复覆盖问题. 要学习dacning links 算法,首先要先了解该算法适用的问题,精确覆盖问题和重复 ...
- [转]MegCup2015初赛题
原文链接 门票题:数独有多少种对解线上没有1的填法? 这道"门票题"虽说只是"热身",但还是有一定难度的.共有245名选手通过各种方法拿到了门票.下面,我们就为 ...
- node.js Web应用框架Express入门指南
node.js Web应用框架Express入门指南 作者: 字体:[增加 减小] 类型:转载 时间:2014-05-28 我要评论 这篇文章主要介绍了node.js Web应用框架Express入门 ...
- 36、有效的数独 | 算法(leetode,附思维导图 + 全部解法)300题
零 标题:算法(leetode,附思维导图 + 全部解法)300题之(36)有效的数独 前言 1)码农三少 ,一个致力于 编写极简.但齐全题解(算法) 的博主. 2)文末附赠 价值上百美刀 资料. 一 ...
- 数独的C++解法
grid.h #ifndef _GRID_H_ #define _GRID_H_ #include <set> #include <cstddef> class Grid { ...
- [LeetCode] Sudoku Solver 求解数独
Write a program to solve a Sudoku puzzle by filling the empty cells. Empty cells are indicated by th ...
随机推荐
- maven BUILD FAILURE
maven BUILD FAILURE 使用命令进行导包失败,错误为BUILD FAILURE 然后使用mvn help:system看一下是不是maven有问提 然后出现了新的错误No plugin ...
- 力扣599(java&python)- 两个列表的最小索引总和(简单)
题目: 假设 Andy 和 Doris 想在晚餐时选择一家餐厅,并且他们都有一个表示最喜爱餐厅的列表,每个餐厅的名字用字符串表示. 你需要帮助他们用最少的索引和找出他们共同喜爱的餐厅. 如果答案不止一 ...
- Pygame安装以及解决问题:Try to run this command from the system terminal. Make sure that you use the correct version of 'pip......
在这里记录一下我的安装过程: 1.首先找到自己python程序安装目录下的Scripts文件夹(里面有pip这里面): 2.使用快捷键win + R 打开终端,先进入到安装python的盘符,然后进入 ...
- 系列解读SMC-R:透明无感提升云上 TCP 应用网络性能(一)| 龙蜥技术
简介:已有的应用若想使用RDMA技术改造成本高,那么有没有一种技术是不做任何改造就可以享受RDMA带来的性能优势? 文/龙蜥社区高性能网络SIG 引言 Shared Memory Communi ...
- 分久必合的Lindorm传奇
简介: 2009年,阿里巴巴首先提出用分布式架构替代传统商业数据库,成功用自主开源的AliSQL支撑双11数据洪流:2016年,为应对超大规模业务场景,阿里云开始自研分布式数据库.十余年间,阿里巴巴数 ...
- Scheduled SQL: SLS 大规模日志上的全局分析与调度
简介: 本文总结了大规模日志全局分析的需求,讨论SLS上现有的典型分析方案,并延伸到 SLS 原生数据处理方案,介绍 Schedueld SQL 功能与最佳实践. 大规模日志全局分析的需求 数据大规模 ...
- 【ESSD技术解读-02】企业级利器,阿里云 NVMe 盘和共享存储
简介: 当前 NVMe 云盘结合了业界最先进的软硬件技术,在云存储市场,首创性同时实现了 NVMe 协议 + 共享访问 + IO Fencing 技术.它在 ESSD 之上获得了高可靠.高可用.高性能 ...
- git fatal detected dubious ownership in repository 的解决方法
我换了一台电脑,将旧电脑的硬盘换到新电脑上:我装了双系统,切换到另一个系统时:我发现了 git 代码仓库无法执行 git 命令,不断报错 fatal: detected dubious ownersh ...
- WPF 自定义控件入门 Focusable 与焦点
自定义控件时,如果自定义的控件需要用来接收键盘消息或者是输入法的输入内容,那就需要关注到控件的焦点 默认情况下的自定义控件是没有带可获取焦点的功能的,例如编写一个继承 FrameworkElement ...
- vue+vant+js实现购物车原理小demo(高级版选择与反选)
新增反选功能.上图(这个系列系利用前端框架的原创): main.js: Vue.use(Stepper); Vue.use(Checkbox); Vue.use(CheckboxGroup); .vu ...