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 ...
随机推荐
- WCHAR 字符串拼接
LPCWSTR GetIniPath() { WCHAR buffer[MAX_PATH]; BOOL result = SHGetSpecialFolderPath(0, buffer, CSIDL ...
- 多线程-多个子线程执行结果插入List集合
业务场景:将多个子线程的执行结果存入List,但是总会出现List集合的长度小于子线程的执行数的情况 1.错误示例(多个线程同时操作同一个List对象,List是线程不安全) package unit ...
- 【直播回顾】Hello HarmonyOS进阶课程第四课——ArkUI动画开发
5 月 25 日晚上 19 点,由知名HarmonyOS开发领域的up主九弓子主讲的Hello HarmonyOS进阶系列应用篇第四课<ArkUI动画开发>,在众多HarmonyOS社群内 ...
- nginx重新整理——————http请求的11个阶段中的content阶段[十八]
前言 简单介绍一下content 阶段. 正文 下面介绍一下root和alias. 这个前面其实就提交过了,这里再说明一下. 功能都是一样的:将url映射为文件路径,以返回静态文件内容. 差别:roo ...
- Vue 项目 invalid host header 问题 配置 disableHostCheck:true报错
项目场景:解决 Vue 项目 invalid host header 问题disableHostCheck:true报错 问题描述使用内网穿透时出现 invalid host header找了好多都是 ...
- Vue3.0 框架搭建的后台管理模板
一个Vue3.0框架搭建的后台管理模板 开源vue3.0版本基于vue3.x+ant-design-vue构建的免费开源admin项目,star高达8.4K+ 支持电脑端.手机.平板等平台 底层使用e ...
- redis+lua脚本实现接口限流
写在前面 在多线程的情况下对一个接口进行访问,如果访问次数过大,且没有缓存存在的情况下大量的请求打到数据库可能会存在数据库宕机,从而造成服务的不可用性.往往我们需要对其进行限流操作用来保证服务的高可用 ...
- 鸿蒙HarmonyO实战-ArkUI动画(组件内转场动画)
前言 转场动画是一种在电影.视频和演示文稿中使用的动画效果,用于平滑地切换不同的场景或幻灯片.转场动画可以增加视觉吸引力,改善观众的观看体验. 常见的转场动画包括淡入淡出.滑动.旋转.放大缩小等效果. ...
- 力扣392(java)-判断子序列(简单)
题目: 给定字符串 s 和 t ,判断 s 是否为 t 的子序列. 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串.(例如,"ace&quo ...
- 第3章 python 爬虫抓包与数据解析
第 3章 Python 爬虫抓包与数据解析 3.1 抓包进阶 目前,我们已经会使用 Chrome 浏览器自带的开发者工具来抓取访问网页的数据包,但是这种抓包方法有局限性,比如只能监听一个浏览器选项卡, ...