zoukankan      html  css  js  c++  java
  • 16.两岛联通

    class Solution {
    public:
        void dfs(vector<vector<int>>& A,int i,int j){
            if(i<0||i>=A.size()||j<0||j>=A[0].size())return;
            if(A[i][j]==1) A[i][j]=2;
            else return;
            dfs(A,i+1,j);
            dfs(A,i-1,j);
            dfs(A,i,j+1);
            dfs(A,i,j-1);
        }
        bool bfs(vector<vector<int>>& A,set<pair<int,int> >&v){
            set<pair<int,int> >vvv=set<pair<int,int> >(v);
            for(auto vv:vvv){
                if((vv.second+1<A[0].size()&&A[vv.first][vv.second+1]==2)||(vv.second-1>=0&&A[vv.first][vv.second-1]==2)||(vv.first-1>=0&&A[vv.first-1][vv.second]==2)||(vv.first+1<A.size()&&A[vv.first+1][vv.second]==2)) return 1;
                if(vv.second+1<A[0].size()&&A[vv.first][vv.second+1]==0){A[vv.first][vv.second+1]=1;v.insert(make_pair(vv.first,vv.second+1));}
                if(vv.second-1>=0&&A[vv.first][vv.second-1]==0){A[vv.first][vv.second-1]=1;v.insert(make_pair(vv.first,vv.second-1));}
                if(vv.first+1<A.size()&&A[vv.first+1][vv.second]==0){A[vv.first+1][vv.second]=1;v.insert(make_pair(vv.first+1,vv.second));}
                if(vv.first-1>=0&&A[vv.first-1][vv.second]==0){A[vv.first-1][vv.second]=1;v.insert(make_pair(vv.first-1,vv.second));}
                v.erase(vv);
            }
            return 0;
        }
        int shortestBridge(vector<vector<int>>& A) {
            int i,j,p,q;
            for( i=0;i<A.size();i++){
                for( j=0;j<A[0].size();j++){
                    if(A[i][j]==0)continue;
                    else {p=i;q=j;break;}
                }
            }
            dfs(A,p,q);
            set<pair<int,int> >v;
            for(i=0;i<A.size();i++){
                for(j=0;j<A[0].size();j++){
                    if(A[i][j]==1){v.insert(make_pair(i,j));}
                }
            }
            int ans=0;
            while(!bfs(A,v)){ans++;}
            return ans;
        }
    };

    找到一个'1'后,dfs(上下左右)找出所有相连。

    找出第二座岛的所有序号,放在一个set里,每次往外拓展一层,直到碰到第一座岛

  • 相关阅读:
    html表格,table标签
    2-3VRP的基本配置
    6 sys模块
    3 datetime模块
    2 time模块
    1 模块和包的介绍
    12 函数进阶---生成器
    13 函数进阶---迭代器
    10 函数进阶---闭包
    11 函数进阶---装饰器
  • 原文地址:https://www.cnblogs.com/apo2019/p/13356902.html
Copyright © 2011-2022 走看看