1 条题解

  • 2
    @ 2019-01-20 09:42:52

    本题为搜索题。做法为将每个连通块上色,即标记为不同数字,并求出面积。然后遍历每个不种草的格子,求其四面相邻的连通块面积和再加1,取最大值即可。

    #include<iostream>
    #include<vector> 
    #include<set>
    using namespace std;
    int N;
    int dx[4]={1,-1,0,0};
    int dy[4]={0,0,1,-1};
    int area[1000001];
    vector<vector<int> > grid;
    int largestIsland(vector<vector<int>>& grid) ;
    int dfs(vector<vector<int>>& grid,int x,int y,int index);
    int judge(int x,int y);
    int main()
    {
        cin>>N;
        for(int i=0;i<N;i++)
        {
            vector<int> row;
            for(int j=0;j<N;j++)
            {
                int temp;
                cin>>temp;
                row.push_back(temp);
            }
            grid.push_back(row);
        }
        cout<<largestIsland(grid)<<endl;
        return 0;
    }
    int largestIsland(vector<vector<int>>& grid) 
    {
        N=grid.size();
        int i,j,color=2,res=0;
        for(i=0;i<N;i++)
        {
            for(j=0;j<N;j++)
            {
                if(grid[i][j]==1)
                {
                    area[color]=dfs(grid,i,j,color);
                    res=max(res,area[color++]);
                }
            }
        }
    //遍历每个不种草的格子 
        for(i=0;i<N;i++)
        {
            for(j=0;j<N;j++)
            {
                if(grid[i][j]==0)
                {
    //使用set判重,因其四面连接的连通块若有同一个,则不能重复相加 
                    set<int> vis;
                    int cur=1;
                    for(int k=0;k<4;k++)
                    {
                        if(judge(i+dx[k],j+dy[k])&&grid[i+dx[k]][j+dy[k]]>1&&vis.count(grid[i+dx[k]][j+dy[k]])==0)
                        {
                            vis.insert(grid[i+dx[k]][j+dy[k]]);
                            cur+=area[grid[i+dx[k]][j+dy[k]]];
                        }
                    }
                    res=max(res,cur);
                }
            }
        }
        return res;
    }
    int dfs(vector<vector<int>>& grid,int x,int y,int index)
    {
        int temparea=0;
        grid[x][y]=index;
        for(int k=0;k<4;k++)
        {
            if(judge(x+dx[k],y+dy[k])&&grid[x+dx[k]][y+dy[k]]==1)
                temparea+=dfs(grid,x+dx[k],y+dy[k],index);
        }
        return temparea+1;
    }
    int judge(int x,int y)
    {
        return x>=0&&x<N&&y>=0&&y<N;
    }
    
    
    
  • 1

信息

难度
5
分类
(无)
标签
(无)
递交数
61
已通过
19
通过率
31%
被复制
3
上传者