您的位置:首页 > 理论基础 > 数据结构算法

[数据结构和算法]九宫格算法

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]]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 数据结构