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

原创 2016年03月09日 23:59:10

描述

典型的九宫格命题: 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]]

游戏制作中的大宝剑---常用的数据结构与算法

前言    时间流逝,物是人非,就好像涌动的河流,永无终焉,幼稚的心智将变得高尚,青年的爱慕将变得深刻,清澈之水折射着成长。                                      ...

备忘小算法:Java将一维数组数据绘制成N行M列矩阵(如九宫格)

备忘小算法:Java将一维数据绘制成N行N列矩阵(如九宫格) 一个小算法的备忘:用Java将一维数组数据绘制成N行N列的矩阵。特别的,如果刚好9个数据,则列数即为3,行数即为3,那么就是典型的如九宫格...

九宫格算法

  • 2013年11月18日 19:08
  • 361KB
  • 下载

九宫格游戏及其求解算法

  • 2008年11月16日 10:44
  • 276KB
  • 下载

JavaScript九宫格数独生成算法

JavaScript数独游戏。JavaScript生成数独算法。

iOS UI设计---九宫格布局算法

在移动端开发中,我们经常会碰见类似下图的布局---九宫格布局。九宫格布局对于整体的UI设计有着重要的作用。 九宫格布局设计开发中,着重需要确认每个九宫格左上角的位置,也就是坐标。下面,我们以iOS开...

九宫格问题的回溯算法

  • 2010年07月02日 10:39
  • 1KB
  • 下载

Android-九宫格算法实现课表

  • 2015年12月03日 10:03
  • 1.6MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[数据结构和算法]九宫格算法
举报原因:
原因补充:

(最多只允许输入30个字)