判断数独是否有效

require 'matrix'
class Sudoku
  def initialize(array)
    @array = array
  end

  def is_valid
    #判断是否为正方形的二维数组
    @array.each do |ele|
      return false if ele.size != @array.size
    end
    #判断行数和列数开方后是否为整数,因为是正方形,只需要判断行数
    m = Matrix[*@array]
    size = m.row_count
    return false if Math::sqrt(size) != Math::sqrt(size).ceil
    #判断每一行和每一列每个数字只出现1次,例如4x4的数独,每一行和每一列是否都是由1、2、3、4组成
    #先根据数独的长度得到一个正则,比如9x9,那么正则就是/^123456789$/
    string = (1..size).to_a.join("")
    reg = Regexp.new "^#{string}$"
    (0..size-1).each do |i|
      #把每一行和每一列的数字先排序再转成字符串,再去与正则表达式匹配,如果能匹配,则正确
      return false unless !!(m.row(i).sort.join =~ reg)
      return false unless !!(m.column(i).sort.join =~ reg)
    end
    #判断每个子数独中每个数字只出现1次,例如4x4的数独,那么其中的2x2的数独中是否都是由1、2、3、4组成
    sub_size = Math::sqrt(size).ceil
    0.step(size-1,sub_size) do |i|
      0.step(size-1,sub_size) do |j|
        #把子数独中的数字先排序再转成字符串,再去与正则表达式匹配,如果能匹配,则正确
        return false unless !!(m.minor(i..i+sub_size-1,j..j+sub_size-1).to_a.flatten.sort.join =~ reg)
      end
    end

    return true
  end

end
goodSudoku1 = Sudoku.new([
  [7,8,4, 1,5,9, 3,2,6],
  [5,3,9, 6,7,2, 8,4,1],
  [6,1,2, 4,3,8, 7,5,9],

  [9,2,8, 7,1,5, 4,6,3],
  [3,5,7, 8,4,6, 1,9,2],
  [4,6,1, 9,2,3, 5,8,7],
  
  [8,7,6, 3,9,4, 2,1,5],
  [2,4,3, 5,6,1, 9,7,8],
  [1,9,5, 2,8,7, 6,3,4]
])

p goodSudoku1.is_valid

goodSudoku2 = Sudoku.new([[1,4, 2,3],[3,2, 4,1],[4,1, 3,2],[2,3, 1,4]])
p goodSudoku2.is_valid

下面的也可以

require 'matrix'
def done_or_not(board)
  #your code here  
  return false unless board.size == 9
  board.each {|e| return false  unless e.size == 9}
  
  m = Matrix[*board]
  for i in 0..m.row_size - 1
    return false unless m.row(i).reduce(:+) == 45    
  end
  
  for j in 0..m.column_size - 1
    return false unless m.column(j).reduce(:+) == 45 
  end
  
  0.step(6,3) do |i|
    0.step(6,3) do |j|
      return false unless m.minor(i..i+2, j..j+2).reduce(:+) == 45 
    end
  end

  return true
end
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容

  • 亲,感谢你今天又突破了自己。难受了,也没有让自己淹没,而是选择更好的跟自己相处。 亲,感谢你今天又爱好了自己。晚饭...
    思言悟语阅读 132评论 0 4
  • 遇见他的那刻,她认识了自己。 “嗨,小欣~我在这里” 听着电话里无奈的呼喊,小欣把目光投向四面八方,却忽略了正确的...
    牛排和他的朋友们阅读 398评论 0 0
  • 1 郑重 小孩子会用郑重地态度问一些让成年人觉得可爱可笑的问题,大人是怎么回答的?为什么大多数成年人都是用戏谑和游...
    白菜花君阅读 133评论 0 0
  • >>>> 今天是我和L先生分手的第一千零一天,于是我特地选择在这样的日子写这样一篇文章,作为典型的性格直脾气暴的白...
    如风姑娘阅读 344评论 1 1