Advertisement
Guest User

Untitled

a guest
Sep 26th, 2017
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.59 KB | None | 0 0
  1. # coding: utf-8
  2. # A021:海岸線
  3. from operator import itemgetter
  4.  
  5. H, W = [int(i) for i in input().split()]
  6. s = [[str(j) for j in input()] for i in range(H)]
  7. #print("H,W",H,W)
  8. #print("s",s)
  9.  
  10. line_i = 0
  11. view = []
  12. for line in s:
  13. if "#" in line:
  14. for j in range(W):
  15. if s[line_i][j] == "#":
  16. view.append((line_i, j))
  17. line_i += 1
  18.  
  19. #print("view",view)
  20. #島の面積、海岸線の長さを、島の面積が大きい順に以下の順で出力
  21.  
  22. view_tmp = view[:]
  23. # 俯瞰図から島を見つける
  24. # 見つけた島の面積、海岸線の長さ島情報として島に付加して保存
  25. # また新たに島を見つける・・・を繰り返す
  26. # 俯瞰図の端まで上記を行ったら、島情報から最も島の面積が大きい順に並び替える
  27.  
  28.  
  29. # 俯瞰図から島を見つける
  30. # 俯瞰図から陸地を探す
  31. # 陸地を見つけたらそこから地続きの陸地を見つける
  32. # 地続きの陸地を全て見つけたらそれを島と断定する
  33. # 俯瞰図から見つけた島を取り除く
  34. island = set()
  35. islands = []
  36. while(True):
  37. if len(view_tmp) == 0: # 全ての陸地を島に分別した
  38. break
  39. view = view_tmp[:]
  40.  
  41. line = view[0][0]
  42. row = view[0][1]
  43. for i in range(row, W):
  44. if (line, i) in view: # 同行に地続きの陸地がある場合
  45. #print("add1")
  46. island.add((line, i)) # 島として保存
  47. else:
  48. break
  49. # 次に, 見つけた陸地から下の行を参照して、上下の行,もしくは左右の列が地続きに接している陸地を追加する
  50. for next_line in range(line + 1, H):
  51. for l in range(W):
  52. if (next_line, l) in view:
  53. # 上の行の陸地と地続きの陸地を見つける
  54. if (next_line - 1, l) in island:
  55. island.add((next_line, l))
  56. # その陸地から左右に伸びる陸地を島として保存
  57. for m in range(l+1, W):
  58. if (next_line, m) in view:
  59. island.add((next_line, m))
  60. else:# 途切れたら終了
  61. break
  62. for n in range(l-1, -1, -1):
  63. if (next_line, n) in view:
  64. island.add((next_line, n))
  65. else:# 途切れたら終了
  66. break
  67. print("island",island)
  68. coastline = 0
  69. # 島の最も上端の行
  70. upline = min([row[0] for row in list(island)])
  71. flg = 0
  72. # islandの海岸線の長さを計測する
  73. for i in range(H):
  74. for j in range(W):
  75. if (i, j) in island:
  76. flg = 4
  77. # 島の左右上下の海岸線を計測
  78. if (i,j + 1) in island: # 右が陸地
  79. flg -= 1
  80. if (i, j - 1) in island: # 左が陸地
  81. flg -= 1
  82. if (i + 1, j) in island: # 下が陸地
  83. flg -= 1
  84. if (i - 1, j) in island: # 上が陸地
  85. flg -= 1
  86. coastline += flg
  87.  
  88. #print("coastline",coastline)
  89. # 島と判定された陸地を俯瞰図から削除
  90. view_tmp = list(set(view).difference(island))
  91. view_tmp.sort(key = itemgetter(0,1))
  92. #print("view_tmp",view_tmp)
  93. # 島の情報を記録
  94. islands.append((len(island),coastline))
  95. island = set()
  96. #print(islands)
  97.  
  98. # 面積の大きい順に並べる
  99. islands.sort()
  100. islands.reverse()
  101. for i in islands:
  102. print(str(i[0])+" "+str(i[1]))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement