Chinaunix

标题: [练习] 合并 [打印本页]

作者: rubyish    时间: 2013-11-26 01:25
标题: [练习] 合并
挑一些运动量小的练习练习~{:3_188:}
合并
from:

0 0 1 0 0 1 0 0
1 0 0 0 0 0 0 1
0 0 1 0 0 1 0 1
0 1 0 0 0 1 0 0
1 0 0 0 0 0 0 0
0 0 1 1 0 1 1 0
1 0 1 1 0 1 1 0
0 0 0 0 1 0 0 0
0 0 1 0 0 0 1 0
0 0 1 1 1 1 1 1

to:
0 0 1 0 0 2 0 0
3 0 0 0 0 0 0 4
0 0 5 0 0 6 0 4
0 5 0 0 0 6 0 0
5 0 0 0 0 0 0 0
0 0 7 7 0 7 7 0
8 0 7 7 0 7 7 0
0 0 0 0 7 0 0 0
0 0 9 0 0 0 9 0
0 0 9 9 9 9 9 9


作者: rubyish    时间: 2013-11-26 01:38
本帖最后由 rubyish 于 2013-11-27 20:43 编辑

v2:{:3_188:}
  1. #!/usr/bin/ruby -w
  2. nteam     = 1
  3. hregister = Hash.new {|h, k| h[k] = [] }
  4. hdata     = Hash.new {|h, k| h[k] = Hash.new 0 }

  5. DATA.each_with_index do |l, i|
  6.   l.split.each_with_index do |e, j|
  7.     e == ?0 and hdata[i][j] = 0 and next
  8.     *asite = [i, j-1], [i-1, j-1], [i-1, j], [i-1, j+1]
  9.     nbuddy, ngang = asite.reject {|r| r[0] < 0 }.
  10.       map {|x, y| hdata[x][y] }.reject(&:zero?).uniq.sort
  11.     nbuddy ||= ( nteam += 1 ) - 1
  12.    
  13.     [[i, j], *hregister[ngang]].each do |a, b|
  14.       hdata[a][b] = nbuddy
  15.       hregister[nbuddy] << [a, b]
  16.     end
  17.     hregister.delete ngang
  18.   end
  19. end

  20. hregister.each_with_index do |r, i|
  21.   r[1].each {|x, y| hdata[x][y] = i + 1 }
  22. end

  23. hdata.each_value {|v| puts v.values * ?\s }

  24. __END__
  25. 0 0 1 0 0 1 0 0
  26. 1 0 0 0 0 0 0 1
  27. 0 0 1 0 0 1 0 1
  28. 0 1 0 0 0 1 0 0
  29. 1 0 0 0 0 0 0 0
  30. 0 0 1 1 0 1 1 0
  31. 1 0 1 1 0 1 1 0
  32. 0 0 0 0 1 0 0 0
  33. 0 0 1 0 0 0 1 0
  34. 0 0 1 1 1 1 1 1
复制代码

作者: Sevk    时间: 2013-11-26 20:39
提示: 作者被禁止或删除 内容自动屏蔽




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2