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

原创 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]]

数独(九宫格)的高效算法

比较容易想到的是用回溯法,从第一个格子开始到最后一格,每个格子由1到9进行尝试,看能否填下去,不能就回头。思路简单,可是执行时间太长了。有没有更加高效的搜索算法了?当然有。       我们仅需...
  • li_wei_quan
  • li_wei_quan
  • 2015年12月19日 21:06
  • 7317

一道九宫格算法面试题

前言一前公司同事把此题放在群里,求大家帮忙解答。因为没有其他条件和说明。我的第一印象就是:方格里应该填1~9整数中剩下的1~8,且不能重复。于是拿着笔进行了一通计算。。。后来发现无解。接着,就想里面的...
  • a10615
  • a10615
  • 2016年08月12日 03:35
  • 2717

iOS之OC随笔-九宫格的算法简单实现

九宫格的算法分析: Tables Are Cool 0 1 2 3 4 5 6 7 8 格子间: 间隙 = (控制器view的宽度 - 3 * 应...
  • ning_ya9293
  • ning_ya9293
  • 2015年09月13日 19:37
  • 4648

算法提高 9-1九宫格

问题描述   九宫格。输入1-9这9个数字的一种任意排序,构成3*3二维数组。如果每行、每列以及对角线之和都相等,打印1。否则打印0。 样例输出 与上面的样例输入对应的输出。 例:...
  • qq_36238595
  • qq_36238595
  • 2016年12月25日 13:32
  • 1122

算法提高 9-1九宫格

问题描述   九宫格。输入1-9这9个数字的一种任意排序,构成3*3二维数组。如果每行、每列以及对角线之和都相等,打印1。否则打印0。 样例输出 与上面的样例输入对应的输出。 例: 数据规模...
  • qq_30091945
  • qq_30091945
  • 2017年02月11日 18:43
  • 828

九宫格算法

有时候布局的时候需要像九宫格那样布局,我自己也遇到过好多次,每次处理起来感觉好麻烦,后面自己研究了一下,发现了一个很简单的算法,几句代码就可以轻松搞定。这次在我做毕业设计的时候又遇到了这个问题,于是我...
  • u010545480
  • u010545480
  • 2015年03月06日 16:57
  • 808

九宫格算法理解

  • xiuye2015
  • xiuye2015
  • 2016年10月23日 17:34
  • 2398

java 实现的九宫格算法

  • 2014年04月04日 13:49
  • 2KB
  • 下载

简单九宫格算法

/** * */ package com.test; public class ShuDu { static boolean next(int[][] n, int i, int...
  • Raysen
  • Raysen
  • 2012年07月09日 10:15
  • 1515

C#简单实现九宫数独算法:穷举+回溯

一、游戏介绍:   「数独sudoku」来自日文,但概念源自「拉丁方块」,是十八世纪瑞士数学家欧拉发明的。游戏规则很简单:在九个九宫格里,填入1到9的数字,让每个数字在每个行、列及九宫格里都只出现一次...
  • canhui87
  • canhui87
  • 2009年12月13日 15:24
  • 6506
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[数据结构和算法]九宫格算法
举报原因:
原因补充:

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