返回题解分享
讨论 / 题解分享/ 帖子详情

岛屿个数(编程题) - 题解

#include<bits/stdc++.h>
using namespace std;
int M,N,cnt;
char Map[55][55];
//找外海 
int d[8][2]=
{
    {0,-1},
    {0,1},
    {1,0},
    {-1,0},
    {1,1},
    {1,-1},
    {-1,1},
    {-1,-1}
};
void dfs_sea(int x,int y)
{
     Map[x][y]='2';
     for(int i=0;i<8;i++)
     {
        int tx=x+d[i][0],ty=y+d[i][1];
        if(tx>=0&&tx<=M+1&&ty>=0&&ty<=N+1&&Map[tx][ty]=='0')
         dfs_sea(tx,ty);
    }
}
//找与外海相邻的岛,一定是外岛
void dfs_island(int x,int y)
{
    Map[x][y]='3';//防止主函数里重复搜索
     for(int i=0;i<4;i++)
     {
         int tx=x+d[i][0],ty=y+d[i][1];
         if(tx>=1&&tx<=M&&ty>=1&&ty<=N&&Map[tx][ty]=='1')
           dfs_island(tx,ty);
      }
}
int main()
{
    int T;
    cin >> T;
    while(T--)
    {
        cin >> M>>N;
        //把最外圈变成海
        for(int i=0;i<=M+1;i++)
            for(int j=0;j<=N+1;j++)
                Map[i][j]='0';
        //输入地图
        for(int i=1;i<=M;i++)
            for(int j=1;j<=N;j++)
                cin>>Map[i][j];
        dfs_sea(0,0);
        cnt=0;//答案
        for(int i=1;i<=M;i++)
        {
            for(int j=1;j<=N;j++)
            {
                if(Map[i][j]=='1' && Map[i][j-1]=='2')
                {
                    dfs_island(i,j);
                    cnt++;
                }
            }
        }
        cout << cnt<<endl;
    }
return 0;
}
0 回复 0 转发 4 喜欢 4 阅读
回复 (0)
默认 最新
暂无回复,快来抢沙发!