NYOJ1237 最大岛屿(深搜DFS)

45 阅读1分钟

题目:

\

\

代码:

思路:这个和前面的水池数目很像,主要是要统计一下最大的岛屿面积,加一个变量计数就好

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <math.h>
#include <stack>
#include <queue>
#include <vector>
#include <algorithm>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
char a[501][501];
int map[501][501],cnt,maxx;
int go[8][2]= {{-1,1},{0,1},{1,1},{-1,0},{1,0},{-1,-1},{0,-1},{1,-1}};//八个方向
int m,n,t;
void dfs(int i,int j)
{
    cnt++;//记录单位面积的个数
    map[i][j]=0;//走过的标记为0
    for(int k=0; k<8; k++)
    {
        int xx=i+go[k][0];
        int yy=j+go[k][1];
        if(xx>=0&&xx<m&&yy>=0&&yy<n&&map[xx][yy]==1)//判断边界
        {
            dfs(xx,yy);//搜下一层
        }
    }
    return;
}
int main()
{
    while(~scanf("%d%d%d",&m,&n,&t))//输入数据
    {
        mem(map,0);
        mem(a,0);
        int sum=0;
        cnt=0,maxx=0;
        getchar();
        for(int i=0; i<m; i++)
            gets(a[i]);
        for(int i=0; i<m; i++)
        {
            int q=0;
            for(int j=0; j<strlen(a[i]); j++)
                if(a[i][j]=='0'||a[i][j]=='1')
                    map[i][q++]=a[i][j]-'0';
        }//这一步主要是用来转换不规则的字符地图为规则的整数地图,并存在map中
        for(int i=0; i<m; i++)
            for(int j=0; j<n; j++)//遍历地图
                if(map[i][j]==1)
                {
                    sum++;//记录岛屿数
                    dfs(i,j);
                    if(cnt>maxx)
                        maxx=cnt;
                    cnt=0;
                }
        printf("%d %d\n",sum,maxx*t);
    }
    return 0;
}


\

\