目录
题目
题目描述
一张矩形的卫星地图,有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,2,1之间各有1个空格,下同。 L 5 1 L 6 1 C 3 2 C 4 1
数据范围与提示
1≤ M,N ≤ 1000
分析
本题我主要采用了“暴力枚举”的方法,遍历每一个数组元素,来判断他们是否是S型,L型,C型
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
cin>>a[i][j];
if(a[i][j]==1){
vis[i][j]=true;
}
}
}
上面这一段代码是输入,vis用来统计此房子有没有标记过
if(a[i][j+1]==0&&a[i-1][j]==0&&a[i][j-1]==0&&a[i+1][j]==0){
sxing++;//判断S型
}else if(a[i][j+1]==1&&vis[i][j]==true){
int sum=2,k=j+2;
vis[i][j]=false;
vis[i][j+1]=false;
while(a[i][k]==1){
vis[i][k]=false;
sum++;
k++;
}
lx[sum]++;
}//判断L型
上面分别是判断S型和L型,下面的判断C型和L型的判断差不多
else if(a[i+1][j]==1&&vis[i][j]==true){
int sum1=2,k1=i+2;
vis[i][j]=false;
vis[i+1][j]=false;
while(a[k1][j]==1){
vis[k1][j]=false;
sum1++;
k1++;
}
cx[sum1]++;
}//判断C型
然后咱们输出
if(sxing!=0){
cout<<"S "<<sxing<<endl;
}
for(int i=2;i<=m;i++){
if(lx[i]!=0){
cout<<"L "<<i<<" "<<lx[i];
cout<<endl;
}
}
for(int i=2;i<=m;i++){
if(cx[i]!=0){
cout<<"C "<<i<<" "<<cx[i];
cout<<endl;
}
}
接下来是参考代码
参考代码
#include<bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
typedef long long ll;
const int MAX=1005;
int read(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
long long a[MAX][MAX],n,m,sxing;
long long lx[MAX],cx[MAX];
bool vis[MAX][MAX];
int main(){
ios::sync_with_stdio(false);
memset(a,0,sizeof(a));
cin.tie(0),cout.tie(0);
cin>>m>>n;
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
cin>>a[i][j];
if(a[i][j]==1){
vis[i][j]=true;
}
}
}
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(a[i][j]==1){
if(a[i][j+1]==0&&a[i-1][j]==0&&a[i][j-1]==0&&a[i+1][j]==0){
sxing++;
}else if(a[i][j+1]==1&&vis[i][j]==true){
int sum=2,k=j+2;
vis[i][j]=false;
vis[i][j+1]=false;
while(a[i][k]==1){
vis[i][k]=false;
sum++;
k++;
}
lx[sum]++;
}else if(a[i+1][j]==1&&vis[i][j]==true){
int sum1=2,k1=i+2;
vis[i][j]=false;
vis[i+1][j]=false;
while(a[k1][j]==1){
vis[k1][j]=false;
sum1++;
k1++;
}
cx[sum1]++;
}
}
}
}
if(sxing!=0){
cout<<"S "<<sxing<<endl;
}
for(int i=2;i<=m;i++){
if(lx[i]!=0){
cout<<"L "<<i<<" "<<lx[i];
cout<<endl;
}
}
for(int i=2;i<=m;i++){
if(cx[i]!=0){
cout<<"C "<<i<<" "<<cx[i];
cout<<endl;
}
}
return 0;
}