祝点进来的人RP++
  • 板块灌水区
  • 楼主yangkaiyi
  • 当前回复9
  • 已保存回复9
  • 发布时间2024/8/10 21:57
  • 上次更新2024/8/10 23:45:00
查看原帖
祝点进来的人RP++
1226849
yangkaiyi楼主2024/8/10 21:57

【题目描述】(bb.cpp)

乐乐在一个旅游景点,他需要你找出地图中所有的平地,乐乐对平地的定义是这样的:平地是一块连通的并且高度都相同区域。

乐乐希望知道平地的个数。

保证不会出现一块大平地——不会出现每个小区域高度都相同的情况。

问题:给出N*M格的每格的高度信息,求出平地个数。

【输入】

第一行两个整数N,M。

接着N行,每行有M个数字,表示高度信息,之间用一个空格隔开。

【输出】

输出一行一个整数,表示平地个数。

【样例输入1】

2 2

1 2

1 1

【样例输出1】

2

【样例输入2】

3 4

1 3 2 6

1 2 2 7

3 2 2 5

【样例输出2】

7

【数据规模】

对于20%的数据: N,M ≤ 10。

对于60%的数据: N,M ≤ 100。

对于100%的数据: N,M ≤ 1000;高度信息 ≤ 1000000000。

为什么我运行时错误0分

#include <bits/stdc++.h>
#define int long long
#pragma GCC optimize("02")
using namespace std;
const int e[4][2]={-1,0,1,0,0,-1,0,1};
int n,m,i,j,s,a[1010][1010],f[1010][1010],b[1000010],c[1000010];
int bfs(int x,int y,int z){
	int fx,fy,i,t,w,sx,sy;
	t=w=1;b[1]=x;c[1]=y;
	while(t<=w){
		fx=b[t];fy=c[t];
		for(i=0;i<4;i++){
			sx=fx+e[i][0];sy=fy+e[i][1];
			if(sx<1||sy<1||sx>n||sy>m) continue;
			if(f[sx][sy]==1) continue;
			if(a[sx][sy]==z)w++,b[w]=sx,c[w]=sy,f[sx][sy]=1;
		}
		t++;
	}
}
main(){
	ios::sync_with_stdio(false);
	cin.tie(NULL);cout.tie(NULL);
	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(!f[i][j]) bfs(i,j,a[i][j]),s++;
	cout<<s;
	return 0;
}
2024/8/10 21:57
加载中...