题目如下:
最近你刚买了一个方形小岛,就听说马上要全球变暖,冰川融化,你非常害怕。作为岛主,你想知道假设海平面上升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]就不会死循环。可是按照题意这个等号是不能去的。
请问这是为什么!谢谢!