1 条题解
-
2tysnd LV 8 MOD @ 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
- 上传者