#P0987. 自习室隔间面积

自习室隔间面积

题目背景

学校新建了一间矩形自习室,被划分为 NNMM 列的小座位。相邻座位之间可能有隔板,隔板会阻止同学直接从一个座位走到另一个座位。

每个座位用一个 001515 的整数描述四个方向是否有隔板。把这个数写成二进制后,四位依次表示北、东、南、西四个方向是否有隔板,其中 11 表示有,00 表示没有。

题目描述

自习室边界一定有隔板,输入保证相邻座位之间的隔板信息一致。

请找出所有被隔板分隔出的连通区域,并输出每个区域的面积。面积指区域内包含的座位数量。结果需要按从大到小排序。

在移动时,只需要关心当前位置能否往下走,不用关心下一个位置是否会隔板挡住。

比如 (1,1)(1,1) 可以往右走,但 (1,2)(1,2) 左边有个隔板,那(1,1)(1,1) 还是可以走到 (1,2)(1,2) 的。

输入格式

第一行包含两个整数 NNMM,表示自习室的行数和列数,1N,M10001 \le N,M \le 1000

接下来 NN 行,每行 MM 个整数,范围为 001515,表示对应座位四个方向的隔板情况。

输出格式

输出一行若干个整数,表示所有区域面积,按从大到小排列,用空格隔开。

样例

4 5
9 14 11 12 13
5 15 11 6 7
5 9 14 9 14
3 2 14 3 14
9 4 4 2 1
2 2
13 13
3 6
4
1 2
11 15
2

样例解释

将每个数写成四位二进制,四位从高到低分别表示北、东、南、西四个方向。例如,左上角座位的数值为 99,二进制为 1001,表示它的北侧和西侧有隔板,东侧和南侧没有隔板。

根据隔板情况,自习室被划分为 55 个连通区域:

  • 面积为 99 的区域包含座位:(1,1)(1,1)(1,2)(1,2)(2,1)(2,1)(3,1)(3,1)(3,2)(3,2)(3,3)(3,3)(4,1)(4,1)(4,2)(4,2)(4,3)(4,3)
  • 两个面积为 44 的区域,分别位于自习室中上部和右下部。
  • 面积为 22 的区域包含座位:(1,5)(1,5)(2,5)(2,5)
  • 面积为 11 的区域只包含座位:(2,2)(2,2),它的四周都有隔板。

所有区域的面积为 9,4,4,2,19,4,4,2,1,按从大到小排列后输出:

9 4 4 2 1