数独是一种比较费时费脑的游戏,一般难度的数独玩下来也得1个小时左右,本人是伪数独爱好者,碰到难点的数独需要花上若干个小时,于是偷懒写了一套破解程序,特拿出来分享,希望有人喜欢。

思路:

1、从第一个空格开始,计算出所有可能填充的数字,拿出第一个进行填充,将剩下的可能数字记录下来;

2、接着计算下一个空格所有可能的数字(在前边填充上的基础上),拿出第一个可能进行填充,将剩下的记录;

3、以此下去;

4、直到出现这样一个空格:所有的数字都没法填充(有冲突),就回到最后一次那个假设点,重新尝试其它的可能数字;

5、以此下去;

6、直到填充完所有空格。

实现代码:

using System;
using System.Collections.Generic;
using System.Text;
/* =====================================* Author: 朱乙* Blog: http://blog.csdn.net/sq_zhuyi* Email: sqzhuyi@gmail.com
======================================== */
namespace SudokuResponder
{public class SudokuService{Number[][][][] pArr = null;//存储数独数字public SudokuService(string numStr){string s = numStr.Replace(",", "");if (s.Length != 81){throw new Exception("初始数独错误,必须是81个数字");}int[] numArr = new int[81];for (int i = 0; i < s.Length; i++){numArr[i] = Convert.ToInt32(s[i].ToString());}pArr = GetArray(numArr);}public SudokuService(int[] numArr){if (numArr.Length != 81){throw new Exception("初始数独错误,必须是81个数字");}pArr = GetArray(numArr);}/// <summary>/// 获取结果/// </summary>/// <returns></returns>public string GetResult(){FillArray();StringBuilder sb = new StringBuilder();for (int m = 0; m < 3; m++){for (int i = 0; i < 3; i++){for (int n = 0; n < 3; n++){for (int j = 0; j < 3; j++){sb.Append(pArr[m][n][i][j].Value);}}sb.Append(",");}}return sb.ToString().TrimEnd(',');}/// <summary>/// 打印结果/// </summary>public void PrintResult(){for (int m = 0; m < 3; m++){if (m == 0) Console.WriteLine("".PadLeft(25, '-'));for (int i = 0; i < 3; i++){for (int n = 0; n < 3; n++){if (n == 0) Console.Write("| ");for (int j = 0; j < 3; j++){var pv = pArr[m][n][i][j];if (pv.Default) Console.ForegroundColor = ConsoleColor.Red;Console.Write("{0} ", pv.Value);Console.ForegroundColor = ConsoleColor.White;}Console.Write("| ");}Console.WriteLine();}Console.WriteLine("".PadLeft(25, '-'));}}private Number[][][][] GetArray(int[] defVal){Number[][][][] pArr = new Number[3][][][];for (int m = 0; m < 3; m++){pArr[m] = new Number[3][][];for (int n = 0; n < 3; n++){pArr[m][n] = new Number[3][];for (int i = 0; i < 3; i++){pArr[m][n][i] = new Number[3];for (int j = 0; j < 3; j++){pArr[m][n][i][j] = new Number() { Value = 0, Default = false };}}}}int c = 0;for (int m = 0; m < 3; m++){for (int i = 0; i < 3; i++){for (int n = 0; n < 3; n++){for (int j = 0; j < 3; j++){int val = defVal[c++];pArr[m][n][i][j].Value = val;if (val > 0)pArr[m][n][i][j].Default = true;}}}}return pArr;}private void FillArray(){for (int m = 0; m < 3; m++){for (int n = 0; n < 3; n++){for (int i = 0; i < 3; i++){for (int j = 0; j < 3; j++){if (pArr[m][n][i][j].Default == false){//空白格var pv = GetNumber(new int[4] { m, n, i, j });if (!pv.Ok){m = pv.Position[0];n = pv.Position[1];i = pv.Position[2];j = pv.Position[3];ClearAfter(pv.Position);}pArr[m][n][i][j].Value = pv.Value;}}}//end small}}//end big}//清空该位置后边的空格private void ClearAfter(int[] pos){int min = pos[0] * 1000 + pos[1] * 100 + pos[2] * 10 + pos[3];for (int m = 0; m < 3; m++){for (int n = 0; n < 3; n++){for (int i = 0; i < 3; i++){for (int j = 0; j < 3; j++){if (m * 1000 + n * 100 + i * 10 + j > min){if (pArr[m][n][i][j].Default == false){pArr[m][n][i][j].Value = 0;}}}}}}}//记录每个位置的可能数字private List<PosValues> posVals = new List<PosValues>();//获取当前位置的可能数字private PosValues GetNumber(int[] pos){List<int> nums = new List<int>();for (int n = 1; n <= 9; n++){nums.Add(n);}//3宫格内for (int i = 0; i < 3; i++){for (int j = 0; j < 3; j++){int a = pArr[pos[0]][pos[1]][i][j].Value;if (a > 0 && nums.Contains(a)){nums.Remove(a);}}}//横向for (int n = 0; n < 3; n++){for (int j = 0; j < 3; j++){int a = pArr[pos[0]][n][pos[2]][j].Value;if (a > 0 && nums.Contains(a)){nums.Remove(a);}}}//纵向for (int m = 0; m < 3; m++){for (int i = 0; i < 3; i++){int a = pArr[m][pos[1]][i][pos[3]].Value;if (a > 0 && nums.Contains(a)){nums.Remove(a);}}}if (nums.Count == 0){if (posVals.Count == 0){return new PosValues(){Value = 0};}var pv = posVals[posVals.Count - 1];pv.Ok = false;pv.Value = pv.Values[0];pv.Values.Remove(pv.Value);if (pv.Values.Count == 0){posVals.Remove(pv);}return pv;}else{var pv = new PosValues();pv.Position = pos;pv.Value = nums[0];nums.Remove(pv.Value);pv.Values = nums;if (nums.Count > 0){posVals.Add(pv);}return pv;}}}public struct Number{public int Value;public bool Default;}public class PosValues{public int[] Position;public List<int> Values;public bool Ok = true;public int Value;}
}

调用代码:

using System;
using System.Collections.Generic;namespace SudokuResponder
{class Program{static void Main(string[] args){string s = "000000007,008000400,003801600,804306201,000000000,105407908,007603800,006000100,400000005";SudokuService service = new SudokuService(s);DateTime start = DateTime.Now;string result = service.GetResult();TimeSpan span = DateTime.Now - start;service.PrintResult();Console.WriteLine("计算结束,用时 {0} 毫秒", span.Milliseconds);Console.WriteLine("press enter to exit");Console.ReadLine();}}
}

运行截图:

下载地址:http://download.csdn.net/detail/sq_zhuyi/4411715

作者:朱会震

【开源】完美破解九宫格(数独)游戏相关推荐

  1. 微信小程序版 九宫格数独游戏

    前言 继上次JAVA版的九宫格数独,这几天把java版的迁移到了小程序这边,写一篇记录一下. 核心还是在算法上,话不多说,直接干代码 一.核心算法 先把81个格子填满,填充之前需要先判断当前格子填的数 ...

  2. java数独流程图_九宫格数独游戏C语言解法

    最近几天深圳一直下雨,一个人闷在屋里很是无聊,偶然打开一个小游戏网站看到了我的最爱--九宫格数独游戏.共有1-5五个难度级别,像我这种资深玩家其他难度就不用考虑了,冲着难度5的题目就去了,结果做地汗流 ...

  3. C++ 完美破解九宫格(数独)游戏

    看到CSDN上有位大神用C#写了一个破解数独的程序(点击打开链接),不过我对C#也不懂,比较喜欢C++,就用标准C++也写了一个,希望各位喜欢.三纯程序,纯控制台程序,纯各人爱好,纯算法程序,无win ...

  4. 九宫怎么排列和使用_开心数独:好友都在玩的数独九宫格小游戏,居家无聊杀时间必备!...

    今日游戏推荐 开心数独 关键词:休闲益智.数独.2048.烧脑.数字推理.脑力游戏 游戏简介:数独九宫格,趣味数字谜题小游戏 游戏特色 <开心数独>游戏提供了关卡.随机.四宫.九宫多种玩法 ...

  5. java完成九宫格数独_简单实现java数独游戏

    本文实例为大家分享了java数独游戏的具体代码,供大家参考,具体内容如下 打算把javaFx需要的组件装好以后直接用javaFx的,但似乎eclipse的版本不对,安装了也不能用... 数独代码是在之 ...

  6. Java破解9X9数独小游戏

    背景 最近刷到LeetCode上这道有趣的题目,想起了初中时候对数独的热爱,不禁感慨万分,原来这个用编程不到1m就能出结果,害我以前还浪费了这么多时间去研究. 效果 据说这是最难的数独题目[点此链接进 ...

  7. 数独游戏(1)之绘制九宫格,并初始化数据

    <数独游戏>之绘制九宫格,并初始化数据 1.在工程里的res/values目录下新建一个colors.xml来存放具体颜色值,已供程序通过R.color.颜色名 来调用 this.getR ...

  8. Python实现九宫格小游戏破解

    Python实现九宫格小游戏破解 前段时间看朋友玩九宫格游戏,我也兴趣来潮突然想玩一下,结果有点停不下来- 直到某一关被难住了- 但是我不舒服啊,特么被一个九宫格游戏难住了.不开心,于是想来个破解器. ...

  9. android 手机九宫格解锁实验报告,Android数独游戏实验分析报告.pdf

    本科生实验报告 实验课程 Android 课程设计数独游戏 学院名称 信息科学与技术学院 专业名称 物联网工程 学生姓名 学生学号 指导教师 实验地点 实验成绩 二〇一五 年 十 月 二〇一五 年 十 ...

最新文章

  1. 聊聊linux查看服务和端口状态命令netstat
  2. MSE病毒库离线更新包
  3. CloseHandle()函数的使用(转载)
  4. Java NIO3:缓冲区Buffer
  5. keras 模型量化
  6. raid1 热备盘 linux,Centos 6.5 RAID1加热备盘
  7. codeforces1559 D2. Mocha and Diana (Hard Version)(并查集+启发式合并+随机化)
  8. 用CSS让DIV上下左右居中的方法
  9. linux日常笔记5
  10. Zookeeper日志文件事务日志数据快照
  11. spark rdd map java_Spark map 遍历rdd中的每个元素
  12. uploadify组件文件上传那些事
  13. JS实现页面复制文字时自动加版权
  14. Python案例—AQI 空气质量指数
  15. Windows7下pip安装包报错 Microsoft Visual C++ 9 0 is required Unabl
  16. 以太坊源码分析(53)以太坊测试网络Clique_PoA介绍
  17. Conflux迎来重大升级,引入EVM兼容空间及PoS链
  18. matlab 用visio编辑_【LaTeX】文章中插入Visio及Matlab矢量图
  19. matplotlib画3dbox
  20. 如何把路由器当成交换机用?

热门文章

  1. OSPF 路由协议基础实验
  2. 读懂微信:从1.0到7.0版本,一个主流IM社交工具的进化史
  3. The client socket has failed to connect to X (errno: 99 - Cannot assign requested address).
  4. Opencv第四讲:分离合并通道
  5. SQL语言的使用(一)
  6. 网络工程 网络基础阶段一笔记
  7. MayaAPI官方案例asciiToBinary的修改,实现ma和mb格式互转
  8. CPU散片与盒装的区别
  9. 十代主板改win7_联想天逸510S台式机10代cpu装win7系统及bios设置教程(支持usb)
  10. vue浏览或展示支持视频和图片格式