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 ...
随机推荐
- HarmonyOS卡片刷新服务,信息实时更新一目了然
如今衣食住行娱乐影音等App占据了大多数人的手机,一部手机可以满足日常大多需求,但对需要经常查看或进行简单操作的场景来说,总需要用户点开App操作未免过于繁琐. 针对该问题, HarmonyOS SD ...
- 免费报表工具零代码零基础轻松搞定 web 报表
话说,能制作清单式报表的方式有千千万: 骨灰级的 Excel 控,如果能轻车熟路驾驭 VBA,也能玩出各种花来,再不济借助图表插件外援也能秒杀一众小白选手: 传说中的编程控,只要需求明确没什么做不了的 ...
- redis命令和lua实现分布式锁
Redis分布式锁关键 SETNX 语法: SETNX key value 如果key不存在,则存储(key:value)值,返回1 如果key已经不存在,则不执行操作,返回0 因为这个命令的性质,多 ...
- 【ssm】极简的极省力的开发方式——针对简单型EasyUI的增删改查的后台管理
需要具备技能点: ssm框架搭建,mybatis generator的熟练使用 1.控制器: import java.util.HashMap; import java.util.Map; impor ...
- Vue3.0里为什么要用 Proxy API 替代 defineProperty API
一.Object.defineProperty 定义:Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象 为什么能实现响应式 ...
- T-SQL中执行存储过程与C#执行同样操作的比较
1 exec sp_executesql N"UPDATE [dbo].[Courses] 2 SET [Title] = @0 3 WHERE (([CourseID] = @1) AND ...
- 力扣41(java)-缺失的第一个正数(困难)
题目: 给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数. 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案. 示例 1: 输入:nums = [1,2,0 ...
- Ollama是什么,为什么这么好用
Ollama 是一个开源框架,专为在本地机器上便捷部署和运行大型语言模型(LLM)而设计. 以下是其主要特点和功能概述: 1. 简化部署:Ollama 目标在于简化在 Docker 容器中部署大型语言 ...
- WPF 自定义控件入门 可重写的各个方法或属性的意义
本文属于 WPF 自定义控件入门系列博客.本文整理在 WPF 里面,自定义控件,非用户控件时,可以重写基类的许多方法和属性,这些方法和属性的作用和含义.方便让大家了解到自定义控件时,有哪些方法或属性可 ...
- ASP.NET CORE 发布时不编译Views文件夹
.net core 3.0正式版已经发布,目前整体相对来说已经稳定了,可以进行生产开发. 发布时默认情况下Views是直接编译成DLL文件(XXXXXX.Views.dll),日常开发维护过程中,经常 ...