0表示海洋,1-9表示陆地,小哼降落在(6,8),计算出小哼降落的小岛的面积
1 2 1 0 0 0 0 0 2 3
3 0 2 0 1 2 1 0 1 2
4 0 1 0 1 2 3 2 0 1
3 2 0 0 0 1 2 4 0 0
0 0 0 0 0 0 1 5 3 0
0 1 2 1 0 1 5 4 3 0
0 1 2 3 1 3 6 2 1 0
0 0 3 4 8 9 7 5 0 0
0 0 0 3 7 8 6 0 1 2
0 0 0 0 0 0 0 0 1 0
#include<iostream>
using namespace std;
/*
1 2 1 0 0 0 0 0 2 3
3 0 2 0 1 2 1 0 1 2
4 0 1 0 1 2 3 2 0 1
3 2 0 0 0 1 2 4 0 0
0 0 0 0 0 0 1 5 3 0
0 1 2 1 0 1 5 4 3 0
0 1 2 3 1 3 6 2 1 0
0 0 3 4 8 9 7 5 0 0
0 0 0 3 7 8 6 0 1 2
0 0 0 0 0 0 0 0 1 0
*/
int n,m,startx,starty,head,tail,sum=0,tx,ty;
const int maxn=1000;
int next[4][2]={1,0,-1,0,0,1,0,-1};
int arr[maxn][maxn];
int mark[maxn][maxn]={0};
struct Queue{
int x;
int y;
};
Queue queue[500];
int main()
{
cin>>n>>m>>startx>>starty;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cin>>arr[i][j];
}
}
head=1;
tail=1;
//小哼落点
queue[tail].x=startx;
queue[tail].y=starty;
mark[queue[tail].x][queue[tail].y]=1;
sum++;
tail++;
while(head<tail)
{
//开始4个方向探索
for(int i=0;i<=3;i++)
{
//将head的4个子方向进队
tx=queue[head].x+next[i][0];
ty=queue[head].y+next[i][1];
if(tx<0||tx>n-1||ty<0||ty>m-1)continue;
if(arr[tx][ty]!=0&&mark[tx][ty]==0)
{
queue[tail].x=tx;
queue[tail].y=ty;
mark[queue[tail].x][queue[tail].y]=1;
sum++;
tail++;
}
}
//4个子方向全部进队结束,然后头出队
head++;
}
cout<<sum;
return 0;
}
#include<iostream>
using namespace std;
const int maxn=1000;
int arr[maxn][maxn];
int mark[maxn][maxn]={0};
int next[4][2]={0,1,0,-1,1,0,-1,0};
int n,m,startx,starty,sum=0;
void dfs(int x,int y)
{
int tx,ty;
sum++;
for(int i=0;i<=3;i++)
{
tx=x+next[i][0];
ty=y+next[i][1];
if(tx<0||tx>n-1||ty<0||ty>m-1)continue;
if(arr[tx][ty]!=0&&mark[tx][ty]==0)
{
mark[tx][ty]=1;
dfs(tx,ty);
}
}
return ;
}
int main()
{
cin>>n>>m>>startx>>starty;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cin>>arr[i][j];
}
}
mark[startx][starty]=1;
dfs(startx,starty);
cout<<sum;
return 0;
}
输出地图上独立小岛的个数
#include<iostream>
using namespace std;
const int maxn=1000;
int arr[maxn][maxn];
int mark[maxn][maxn]={0};
int next[4][2]={0,1,0,-1,1,0,-1,0};
int n,m,startx,starty,sum=0,color=-1,num=0;
void dfs(int x,int y,int color)
{
int tx,ty;
sum++;
arr[x][y]=color;
for(int i=0;i<=3;i++)
{
tx=x+next[i][0];
ty=y+next[i][1];
if(tx<0||tx>n-1||ty<0||ty>m-1)continue;
if(arr[tx][ty]!=0&&mark[tx][ty]==0)
{
mark[tx][ty]=1;
dfs(tx,ty,color);
}
}
return ;
}
int main()
{
cin>>n>>m;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cin>>arr[i][j];
}
}
//遍历所有点
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
//满足的陆地条件以及没有降落过的条件过的点
if(arr[i][j]!=-1&&arr[i][j]!=0)
{
mark[i][j]=1;
dfs(i,j,color);
num++;
}
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
printf("%3d",arr[i][j]);
}
cout<<endl;
}
cout<<num;
return 0;
}