OJ万题详解––卫星地图(C++详解)

该文介绍了一种处理矩形地图上建筑类型的算法,包括L型、C型和S型建筑的计数。通过遍历地图,使用暴力枚举的方法判断每个元素是否属于特定类型的建筑,统计各类建筑的数量。样例展示了输入和输出格式,以及具体的数据范围。
摘要由CSDN通过智能技术生成

目录

题目

分析

参考代码


题目

题目描述

一张矩形的卫星地图,有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;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cqbzcyy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值