[数据结构和算法]九宫格算法
2016-03-09 23:59
459 查看
描述
典型的九宫格命题: 1 到 9 , 一共10个数, 放在一个 3x3 的表格中,要求表格中的: 同行, 同列 并且 对角线 的所有数字相加 等于 15.问题分析
这个是一个典型的题目,因为数据量比较少,所以完全可以用穷举法实现。代码
def solution() used = [] items = [ [0, 0, 0], [0, 0, 0], [0, 0, 0] ] numbers = (1..9).to_a current_num = 1 help(items, current_num, used, numbers) return items end def relation(num, flag = 'x') x_y = { 1 => [0, 0], 2 => [0, 1], 3 => [0, 2], 4 => [1, 0], 5 => [1, 1], 6 => [1, 2], 7 => [2, 0], 8 => [2, 1], 9 => [2, 2] }[num] flag == 'x' ? x_y.first : x_y.last end def help(a, current_num, used, numbers) if current_num == 10 if validate(a) p a end return end numbers.each do |num| next if used[num] x = relation(current_num, 'x') y = relation(current_num, 'y') a[x][y] = num used[num] = true help(a, current_num + 1, used, numbers) a[x][y] = 0 used[num] = false end end def validate(a) a[0][0] + a[0][1] + a[0][2] == 15 && a[0][0] + a[1][0] + a[2][0] == 15 && a[0][0] + a[1][1] + a[2][2] == 15 && a[1][0] + a[1][1] + a[1][2] == 15 && a[2][0] + a[2][1] + a[2][2] == 15 && a[0][1] + a[1][1] + a[2][1] == 15 && a[0][2] + a[1][1] + a[2][0] == 15 && a[1][1] == 5 end solution
基本思路:
1. 穷举所有的可能情况
- 使用 递归 方法,穷举所有的可能值
- 用一个数组 used 来记录哪些值已经被使用了,因为在同一个二维数组中,不能出现重复的数
- 每次迭代结束后,需要重置数组的值
2. 判断是否满足“同行,同列,对角线”的数之和为15
运行结果
[[2, 7, 6], [9, 5, 1], [4, 3, 8]] [[2, 9, 4], [7, 5, 3], [6, 1, 8]] [[4, 3, 8], [9, 5, 1], [2, 7, 6]] [[4, 9, 2], [3, 5, 7], [8, 1, 6]] [[6, 1, 8], [7, 5, 3], [2, 9, 4]] [[6, 7, 2], [1, 5, 9], [8, 3, 4]] [[8, 1, 6], [3, 5, 7], [4, 9, 2]] [[8, 3, 4], [1, 5, 9], [6, 7, 2]]
相关文章推荐
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- C#数据结构之顺序表(SeqList)实例详解
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 数据结构之Treap详解
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解