锯齿数独 cocos2d-x 开发 (二)
锯齿数独 cocos2d-x 开发 (一)
二、锯齿的生成
1、9*9的格子划分成9个随机形状的连通块。
这里采用了bfs + 并查集的算法。 在bfs生成连通块的同时,检测整个图所有的联通分量, 一些特殊的情况进行剪枝。
bfs 函数如下:
bool JigsawHelper:: bfs(int i, int j, int groupId)
{bool vis[81];memset(vis, 0, sizeof(vis));int n = i * 9 + j;vis[n] = true;queue<int>q;q.push(n);add(i,j,q,vis);int cnt = 1;
// cout<<"-------------------"<<endl;while (cnt <= 9 && !q.empty()){int tp = q.front();q.pop();g[tp] = groupId;if (!check(n)){g[tp] = 0;continue;}cnt ++;add(tp/9,tp%9,q,vis);
// cout<<"("<<tp/9<<","<<tp%9<<")";}
// cout<<"-------------------"<<endl;if (cnt < 10){// cout<<"cnt: "<<cnt<<endl;return false;}return true;
}
check()用于检测当前情况下能否有机会成功划分。
这里有两个重要的判定:
1) 生成过程中不同连通块的个数不得超过九个。
2)生成一个连通块完毕后,剩下的连通块中不能有个数不为9的倍数。
int cnt[81];memset(cnt,0,sizeof(cnt));for (int i = 0; i < 81; i++){int num = FindSet(i);cnt[num]++;}int nParent = FindSet(n);int ans = 0;int small = 0;for (int i = 0; i < 81; i++){if (cnt[i] == 0) continue;if (cnt[i]%9 != 0) //连通个数不是9的倍数{ans ++;}if (cnt[i]%9 != 0 && i != nParent) //小于9的连通块{small += cnt[i]%9;}}if (cnt[nParent] != 9) //生成过程中小连通块的个数和当前块的和大于9{if (small + cnt[nParent] > 9)return false;}if (cnt[nParent] == 9 && ans > 0) //生成结束后仍然有个数不为9的倍数的连通块return false;return true;
到这里并没有结束,仍然有一些刁钻的数据会造成无法继续往下生成的情况,好在只有20%左右的几率。
项目不是做题,复杂度不大,rebuild即可。
void JigsawHelper:: build()
{srand(time(NULL));memset(g,0,sizeof(g));vector<int>vt;for (int i = 0; i < 81; i++)vt.push_back(i);for (int groupId = 1; groupId <= 9; groupId++){int num = vt[rand()%vt.size()];if (!bfs(num/9, num%9, groupId)){cout<<"fail!!!!!!!!!!! rebuild"<<endl;build();return;}vt.clear();for (int i = 0; i < 81; i++){if (g[i] == 0)vt.push_back(i);}}checkColor();
}
2、 染色
由于四色定理的存在,预先准备四种不同的颜色。
将每个连通块看做一个节点,Welch Powel法染色即可。
3、数独的生成及tricks。
获取锯齿数组和颜色数组后就可以重新用DLX解精确覆盖问题了,构造的时候方式略不同而已。
但是最终生成的时候却偶尔会出现卡死的情况!
对于一种锯齿并不是确定有解的。所以这里修改了下生成数独的方式并添加了一些剪枝。
1)选取种子的时候只取一个随机格子随机数。
2)dlx 中dfs时超过一定depth就return false。多次测试取15000。
3)算不出结果继续rebuild, 相信cpu的实力。(实测ipad mini2以上 生成所有难度均在1s之内,完全可以接受的范围)。
4、UI
我只是在简单的背景上添加了81个不同颜色的editbox,限制一下整数。
当然有时间换成用button选择肯定是更好的
void SudokuUI::editBoxTextChanged(EditBox *editBox, const std::string &text)
{char buffer[2];if (text.length() >= 1){char c = text[text.length() - 1];if (!isdigit(c)){editBox->setText("");return;}sprintf(buffer, "%c",c);editBox->setText(buffer); }}
由于锯齿形本身限制较多, 所以比较容易挖更多的洞,生成的效果也明显好一些,感受下难度吧XD~
锯齿数独 cocos2d-x 开发 (二)相关推荐
- 锯齿数独 cocos2d-x 开发 (一)
先放一张游戏截图: 实现功能: 1.两种模式,普通数独和锯齿数独 2.不使用题库,数字及锯齿均纯随机生成,有且仅有唯一解. 3.难度控制. 4.生成时间控制在1s内(ipad mini2) 一.生成普 ...
- 初学者开发iOS游戏的入门必备用书——iOS 5 cocos2d游戏开发实战(第2版)
如果想接触iOS游戏开发,今天笔者就推荐一本"大杀器"--<iOS 5 cocos2d游戏开发实战(第2版)>(当当链接) 为零基础的"设想过自己写个电脑游戏 ...
- springboot flask php,使用Vue,Spring Boot,Flask,Django 完成Vue前后端分离开发(二)
使用Vue完成前后端分离开发(二) Bravery never goes out of fashion. 勇敢永远不过时. 前面简单说了一下 Vue 项目的搭建和项目的大致页面,这里讲一下 Djang ...
- 【Android游戏开发二十七】讲解游戏开发与项目下的hdpi 、mdpi与ldpi资源文件夹以及游戏高清版本的设置...
今天一个开发者问到我为什么游戏开发要删除项目下的hdpi.mdpi和ldpi文件夹:下面详细给大家解答一下: 首先童鞋们如果看过我写的<[Android游戏开发二十一]Android os设备谎 ...
- Qt计算器开发(二):信号槽实现数学表达式合法性检查
表达式的合法性 由于我们的计算器不是单步计算的,所以我们能够一次性输入一个长表达式.然而假设用户输入的长表达式不合法的话,那么就会引发灾难.所以有必要对于用户的输入做一个限制. 一些限制举例: 比方, ...
- SQL2K数据库开发二十三之索引操作重建索引
1.可以使用下面的语句创建索引,重建索引应使用DROP_EXISTING选项. 2.在SQL Server查询分析器中输入如下的SQL语句,点击工具栏上的执行查询图标. 3.查询语句执行完毕后,结果窗 ...
- 以太坊开发(二)使用Ganache CLI在私有链上搭建智能合约
以太坊开发(二)使用Ganache CLI在私有链上搭建智能合约 在上一篇文章中,我们使用Truffle自带的客户端Truffle Develop,在私有链上搭建并运行了官方提供的WebPack智能合 ...
- Java 快速开发二维码生成服务
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | 公众号「码农小胖哥」 1. 前言 不知道从什么 ...
- proc除了能用于oracle开发_能不能用于mysql开发_Oracle数据库开发(二).Linux下配置使用ProC...
一.提要 上文简单介绍了Windows下ProC配置开发,这次我们使用Linux平台再次配置Oracle ProC开 发环境(RedHat Linux 9 + Oracle 92). <ORAC ...
最新文章
- matlab 多项式拟合 ployval
- PHPMaker 2020中文版
- 51nod 1127 最短的包含字符串(尺取法)
- 基础省选+NOI-第6部分 字符串
- linux tar 命令使用
- OTL翻译(4) -- otl_stream类
- BZOJ1301 字符加密Cipher (后缀数组)
- 拓端tecdat|R语言参数检验 :需要多少样本?如何选择样本数量
- 汇编语言转c语言的软件,Arm汇编转换器下载
- 云服务预先定义正确的云计算SLA要求
- html使用表格输入数字,表格中输入数字,为什么出现“####”的原因
- 亚马逊账户违规了?如何自查
- CTFHUB技能树题目解析(持续更新)
- 模糊照片怎么修复清晰?快来看看这两个方法
- C# 如何取得本机网卡的型号,IP地址,子网掩码和网关
- python断网重联_Python实现WiFi断线自动重连的方法详解
- HttpClient模块的HttpGet和HttpPost及Connection to refuse解决
- maven下载依赖提示系统找不到指定路径的问题
- AUTOCAD2008注册
- Django 表单验证之自定义表单验证器