卫星地图
题目描述
一张矩形的卫星地图,有M行N列。行列中的0表示空地,1表示有建筑。有3种类型的建筑:
L型: 仅在一行上占据连续的若干个格子,长度至少为2,至多为N
C型:仅在一列上占据连续的若干个格子,长度至少为2,至多为M
S型:仅占据单个格子。
在同一行上或者同一列上可以出现多个建筑。
不同的建筑不会相邻,相邻是指上,下,左,右,以及左上,左下,右上,右下等八个方向。
求出不同类型的建筑的数量及长度。
输入格式
第1行:2个整数M和N
接下来M行,每行N个0或1,数字之间由空格分开
输出格式
第1行:先输出S,再输出1个整数表示S型建筑的数量,如果没有,则不输出。
接下来若干行,每行依次表示L型建筑的长度以及该长度的建筑数量,按长度递增的顺序输出,中间用一个空格分开,如果没有L型建筑,则不输出。
接下来若干行,每行依次表示C型建筑的长度以及该长度的建筑数量,按长度递增的顺序输出. 中间用一个空格分开,如果没有C型建筑,则不输出。
样例
样例输入
12 12
0 0 0 0 0 0 0 0 0 0 0 1
0 1 1 1 1 1 0 0 0 0 0 1
0 0 0 0 0 0 0 1 0 0 0 1
0 1 0 0 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0 0 0
0 1 0 1 1 1 1 1 1 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 1 0 0 0 0
0 1 1 0 0 0 0 0 0 0 0 0
样例输出
S 1
L 2 1
L 5 1
L 6 1
C 3 2
C 4 1
数据范围与提示
1≤ M,N ≤ 1000
分析
当我们看到这道题后就会想到用map去解决他,因为在计算L建筑和C建筑的时候需要从小到大输出,这时候,我们把建筑的长度作为“键”,把每种建筑的数量作为“值”。
这个题坑很多,这是我第一遍做的代码
第一遍的代码——20
#include <bits/stdc++.h>
using namespace std;
map<int, int> l, c;
map<int, int>::iterator it;
int a[1005][1005], cns, cnl, cnc, cnlm, cncm, n, m, i, j;
int main() {
cin >> n >> m;
for (i = 1; i <= n; i++)
for (j = 1; j <= m; j++) cin >> a[i][j];
for (i = 1; i <= n; i++)
for (j = 1; j <= m; j++)
if (a[i - 1][j] == 0 && a[i + 1][j] == 0 && a[i][j - 1] == 0 && a[i][j + 1] == 0 && a[i][j] == 1)
cns++, a[i][j] = 2;
cout << 'S' << " " << cns << endl;
for (i = 1; i <= n; i++) {
for (j = 1; j <= m; j++) {
if (a[i][j] == 1)
a[i][j] = 2, cnl++;
else
cnl = 0;
cnlm = max(cnlm, cnl);
}
l[cnlm]++;
cnlm = 0, cnl = 0;
}
for (it = l.begin(); it != l.end(); it++) {
if (it->first >= 2 && it->second != 0)
cout << "L"
<< " " << it->first << " " << it->second << endl;
}
for (i = 1; i <= n; i++) {
for (j = 1; j <= m