挑战编程解杀手数独
vb吧
全部回复
仅看楼主
level 1
ooo◎ooo 楼主
规则:1、每行,每列,每宫数字1-9不能重复,虚线框内的数字不能重复。
2、虚线框左上角的数字等于虚线框内所有数字之和。
2018年07月26日 04点07分 1
level 10
这个也有点意思啊,限制条件蛮多的嘛。
有空试试。[滑稽]
2018年07月26日 08点07分 2
level 15
厉害
2018年07月26日 23点07分 3
level 8
81元线性规划。。。
2018年07月27日 02点07分 4
吧务
level 13
上上个月,学校里有学生问我数独题怎么做我看的都比较简单,没想到,到你这里都成这样了。。
2018年07月28日 17点07分 5
对啊,我可以用vb解啊
2018年07月28日 17点07分
吧务
level 14
我个人认为能借鉴一下 @初音✨七奈 的思路
2018年07月28日 17点07分 6
你说上次“爱因斯坦问题”的那个思路?那恐怕没有可比性。[汗]
2018年07月28日 17点07分
确实没有可比性,我试着写了个代码,运行1分钟才出结果……
2018年07月29日 01点07分
@初音✨七奈 这个确实有点麻烦……你说的1分钟,是IDE中运行还是编译后?如果IDE中运行1分钟出结果,还算是过得去的。我正在写一个代码,实际测试时发觉真没预想的那么简单,遇到不少逻辑问题。不过现在也基本上完全理顺了,就剩下码代码的事了。有可能编译后能在15秒内能出结果。[滑稽]
2018年07月29日 08点07分
@涐吢铱舊囿儚 确实是IDE中运行约1分钟出结果,不过是找到一个结果就算了,没有全部判断
2018年07月29日 08点07分
level 5
bfs dfs?
2018年07月29日 23点07分 8
level 1
普通数独我会做,杀手还没试过
2018年07月30日 07点07分 9
level 8
我有一个Idea,等会用CPP实现一下
每次不枚举点的值,直接枚举每一行的情况,
时间复杂度可以从O( n^(n * n) )降至O( (n!) ^ n )
就是实现起来有些难度。
2018年07月30日 09点07分 10
level 15
根据某人要求,放上程序运行的结果
2018年07月31日 10点07分 11
哈哈,这“某人”就是我呗。[滑稽]
2018年07月31日 12点07分
level 10
终于搞定了。 [滑稽]
编译后的程序约9秒算出(我的机子属于低配电脑 -_-!!!),在IDE中运行,约13秒。
费了老大的劲,才发现“正确组合被跳过”的原因,
原来前几天优化运算流程时,不小心给自己挖了很深的坑、然而自己却浑然不觉……
当然也要感谢 11楼 miku_con 给了正确答案参考,才能确定“被跳过”并找到Bug所在。
我还有一个优化流程的想法,也许能运行得更快,
  不过暂时先放一下了,过几天再说罢……
2018年08月01日 08点08分 12
可否提供一下程序代码
2021年03月21日 13点03分
@king007wl 链接:(百度网盘)/s/1RuoqLeJW4fURvjIAImda3Q 提取码:azij 分享链接的前半部分自己补全,完整的链接会被吞,没办法。[狂汗]
2021年03月21日 15点03分
level 11
我觉得这道题,最麻烦的不在于怎么解题。
而在于如何让用户方便的输入“虚线框”的范围……
注意输入的办法到也不少,问题是“方便”……
2018年08月02日 06点08分 13
这个简单,虚线框范围用颜色区分就行
2018年08月02日 06点08分
@ooo◎ooo 阁下的汉语可以再进修
2018年08月02日 06点08分
@璐村惂鐢ㄦ埛_0748V5Z馃惥 就是用不同的颜色来区分不同的虚线框范围。
2018年08月02日 06点08分
level 1
ooo◎ooo 楼主
就像这样:
2018年08月02日 06点08分 14
不过左上角的数字要标出来,用gdi+画个表格就像。
2018年08月02日 06点08分
level 1
ooo◎ooo 楼主
试试这个,难度好像更高一些
2018年08月03日 13点08分 16
我认为并不存在“难度高低”的问题,能解决1个,那么所有的这种题都可以用同样的“思路”解决。只是目前我想到的方案只能是先填数、再验证相应区域的和值,用的仍然是一种“穷举”模式。这样“靠前”的组合就早点出结果、靠后的就得晚点(计算时间长些)出结果而已。
2018年08月03日 13点08分
嗯,试一下这个,运行的时间一定会比刚才的长,要不试试
2018年08月03日 13点08分
@ooo◎ooo 初步的规划代码出来了,编译后、不刷界面,约23秒。[狂汗] 调试运行、刷界面,发现大部分时间都在中间那行最左的那个宫中打转(感觉占了80%以上时间)……也许能解决它的问题,时间就能明显缩短些。
2018年08月04日 12点08分
偶然发现:这回的“答案”不是唯一的……[喷]我一个“先编译好”的程序,还有后来修改过的代码,发觉最终结果不一样(但肯定都是“正确的”)。[汗][汗][汗]
2018年08月04日 12点08分
吧务
level 12
我有一个思路,可以先分享一下。
首先,一个具有固定数值和的连续方块的集合我们称之为数值区。
大格子中的,3*3的正方形格子,我们称之为9宫格。
我们已知:
1.九宫格中的数字各自不相同
2.九宫格中的各个方向的数字和是定值:(1+2
+3
+4+5...+9=(1+9)*9/2=45)
3.某个格子确定了数字后,则此格子所在的行列的其它格子都不得出现这个数字
得到以下的思路:
首先对固定数值区进行划分,看看这个数值区包含多少个九宫格。这样每个九宫格中都需要时不同的数值:例如左下的值为24的区域,就有两个九宫格构成。
还有一些思路还在思考中,包括怎样判断枚举结束。终止条件是什么。
2018年08月03日 14点08分 17
分析下我们需要的函数。对于一个所有格子都在九宫格内的数值区,我们需要有一个函数生成所有可能的排列。 比如3个格子,数值是9的数值区,可能是: 1+2+3 +3 对最后的3进行分配 满足分配后的个数和前面相同,每个数字小于等于后面的数字。
2018年08月03日 14点08分
1 2 尾页