美文网首页
岛屿计数题

岛屿计数题

作者: 小幸运Q | 来源:发表于2019-01-01 11:58 被阅读0次

https://leetcode.com/problems/number-of-islands


第一次看是头条面试题,后来发现google还有leetcode上也有这样的题。先说下思路,一般同学看到这种题目一般是用DFS/BFS递归去做,不过我第一次看到的时候是想到了并查集,将二维数组投影至一维数组空间。

不过初始化是个老问题,我一开始想到的是上下左右全部遍历(还得考虑第一行还有最后一行,第一列和最后一列的特殊情况),但是后来想了一下,遍历左上两个方向其实就可以了,然后对第一行还有其他行的第一个元素进行特殊处理即可。然后将所有值为1 的点与左上两个方向的1连接起来,最后再来次findfather,用map去重计数并记录根节点。这样既可以统计岛屿个数还能统计岛屿的大小。

并查集示例代码:(默认两次回车输入完毕)

#include<iostream>
#include<vector>
#include<string>
#include<cstring>
#include<map>
using namespace std;
#define N 1000
int fathers[N]={0};
int findfather(int s){
  int t=s;
  int f;
  while(fathers[t]!=t){
    t=fathers[t];
  }
  f=t;
  t=s;
  while(fathers[t]!=t){
    fathers[t]=f;
    t=fathers[t];
  }
  return f;
}
void merge(int a,int b){
  int f1=findfather(a);
  int f2=findfather(b);
  fathers[f2]=f1;
}
void deal(vector<vector<int>>v,int line){

}
int main(){
  vector<vector<int>>v;
  int i,j;
  map<int,int>m;
  while(1){
    char p=getchar();
    if(p=='\n'){
      break;
    }
    else{
      vector<int>vv;
      v.push_back(vv);
      v[v.size()-1].push_back(p-'0');
    }
    while(1){
      char c=getchar();
      if(c=='\n'){
        break;
      }
      v[v.size()-1].push_back(c-'0');
    }
    //getchar();
  }
  if(v.size()==0){
    cout<<0;
    return 0;
  }
  int width=v[0].size(),height=v.size();
  // fathers进行调整
  for(i=0;i<width*height;i++){
    fathers[i]=i;
  }
  // cout<<width<<"   "<<height<<endl;
  if(v[0][0]==v[0][1]&&v[0][0]==1){
    merge(0,1);
  }
  for(i=1;i<width;i++){
    if(v[0][i]==v[0][i-1]&&v[0][i]==1){
      merge(i,i-1);
    }
  }
  for(i=1;i<height;i++){
    if(v[i][0]==v[i][1]&&v[i][0]==1){
      merge(i*width+0,i*width+1);
    }
    for(j=1;j<width;j++){
      if(v[i][j]==1){
        if(v[i][j]==v[i][j-1]){
          merge(i*width+j,i*width+j-1);
        }
        if(v[i][j]==v[i-1][j]){
          merge(i*width+j,(i-1)*width+j);
        }
      }
    }
  }
  // 统计岛屿的大小还有根节点的位置
  for(i=0;i<height;i++){
    for(j=0;j<width;j++){
      if(v[i][j]==1){
        int f=findfather(i*width+j);
        if(m.count(f)){
          m[f]++;
        }
        else{
          m[f]=1;
        }
      }
    }
  }
  cout<<"Number of islands: "<<m.size()<<endl;
  for(map<int,int>::iterator it=m.begin();it!=m.end();it++){
     cout<<"Start position: ("<<it->first/width<<","<<it->first%width<<")   scale:"<<it->second<<endl;
  }
}

/*
11110
11010
11001
00001
*/

相关文章

网友评论

      本文标题:岛屿计数题

      本文链接:https://www.haomeiwen.com/subject/valnlqtx.html