站外题求助
  • 板块学术版
  • 楼主youzhigui_nie
  • 当前回复3
  • 已保存回复3
  • 发布时间2022/12/4 20:00
  • 上次更新2023/10/27 00:28:11
查看原帖
站外题求助
756163
youzhigui_nie楼主2022/12/4 20:00

题目如下:

最近你刚买了一个方形小岛,就听说马上要全球变暖,冰川融化,你非常害怕。作为岛主,你想知道假设海平面上升H米,你的小岛还有剩多少面积没被淹没。对于海水能触及的地方,初始海拔大于H才不会被淹。方形小岛由n*n块面积为1的小方块组成,第i行第j列的方块海拔h[i][j]米。海水在方块间流动可以有8个方向。

输入格式 输入第一行为正整数n和整数H,之后为n行n列个整数。n<=200,-100<=H,h[i][j]<=100。

输出格式 输出一个整数代表剩余面积。

输入样例#1: 5 3 1 2 3 4 3 2 3 4 5 4 1 2 3 4 5 0 1 2 3 4 -1 0 1 2 3

输出样例#1: 7

输入样例#2: 3 5 10 10 10 10 -1 10 10 10 10

输出样例#2: 9

这是我的代码:

#include<bits/stdc++.h>
using namespace std;
int dx[8]={1,1,1,0,0,-1,-1,-1};
int dy[8]={1,0,-1,1,-1,1,0,-1};
const int N=209;
int n,H,h[N][N];
bool d[N][N];//记录是否被淹 
void dfs(int x,int y){//从(x,y)开始搜索 
	if(!d[x][y]) d[x][y]++;
	for(int k=0;k<8;k++){//遍历八方向 
		int nx=x+dx[k],ny=y+dy[k];//漫到新位置
		if(nx>=1&&nx<=n&&ny>=1&&ny<=n&&h[x][y]>h[nx][ny])//如果不越界且能够蔓延过去
			dfs(nx,ny);//从新的点开始搜索 
	} 
}
int main(){
	cin>>n>>H;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			cin>>h[i][j];
	for(int i=1;i<=n;i++)
		if(h[i][1]<=H) dfs(i,1);
	for(int i=1;i<=n;i++)
		if(h[1][i]<=H) dfs(1,i);
	for(int i=1;i<=n;i++)
		if(h[i][n]<=H) dfs(i,n);
	for(int i=1;i<=n;i++)
		if(h[n][i]<=H) dfs(n,i);
	int s=n*n;
	int m=0;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			m+=d[i][j];//计算被淹的总面积
			//cout<<"("<<i<<","<<j<<")"<<":"<<d[i][j]<<" ";
		}	
		//cout<<endl;
	}
	cout<<s-m;
	return 0; 
}

不知道为什么会递归死循环,然而当我把第12行里h[x][y]>=h[nx][ny]改为h[x][y]>h[nx][ny]就不会死循环。可是按照题意这个等号是不能去的。

请问这是为什么!谢谢!

2022/12/4 20:00
加载中...